#c# #wcf
#wcf
Вопрос:
В моей службе WCF у меня есть функция, например:
bool ValidateLogin(string user, string password)
после того, как я разместил его в Windows azure и добавил ссылки в свое веб-приложение, эта функция стала:
bool ValidateLogin(string user, string password, out int ValidateLoginResult, out bool ValidateLoginResultSpecified)
Кто-нибудь знает, что это за два параметра? И как я могу предотвратить его добавление после размещения?
Комментарии:
1. Что заставляет вас думать, что эта проблема специфична для Azure?
2. Я думаю, это связано с прокси, сгенерированным при размещении, а не Azure 🙂
Ответ №1:
Установка стиля XmlSerializerFormat в RPC помогла мне. Т.е.
[OperationContract, XmlSerializerFormat(Style = OperationFormatStyle.Rpc)]
bool ValidateLogin(string user, string password)
Это изменяет способ генерации wsdl, начиная с:
<wsdl:message name="IService_ValidateLogin_InputMessage">
<wsdl:part name="parameters" element="tns:ValidateLogin" />
</wsdl:message>
<wsdl:message name="IService_ValidateLogin_OutputMessage">
<wsdl:part name="parameters" element="tns:ValidateLoginResponse" />
</wsdl:message>
Для:
<wsdl:message name="IService_ValidateLogin_InputMessage">
<wsdl:part name="user" type="xsd:string" />
<wsdl:part name="password" type="xsd:string" />
</wsdl:message>
<wsdl:message name="IService_ValidateLogin_OutputMessage">
<wsdl:part name="ValidateLoginResult" type="xsd:boolean" />
</wsdl:message>
В этой статье предлагается другое решение, но также содержится несколько дополнительных пояснений: http://www.codeproject.com/Articles/323097/WCF-ASMX-Interoperability-Removing-the-Annoying-xx
Ответ №2:
По-видимому, это происходит от генератора WSDL, в данном случае используемого в опции «Добавить веб-ссылку …» версии VS 2005:
http://devpinoy.org/blogs/cruizer/archive/2008/10/05/some-wcf-gotchas.aspx
Ответ на форумах MSDN также указывает на устаревшую поддержку:
http://social.msdn.microsoft.com/Forums/en/windowsazure/thread/406a6b6b-9dab-469d-ad0f-1f8f95cf0656
Итак, мой ответ, я предполагаю, что ваш клиент — .NET 2?
Комментарии:
1. Я использую VS 2010 с .NET 4
2. но ваша ссылка мне очень помогает, я выяснил, что мне приходится использовать XmlSerializer с моим OperationContract из-за сгенерированного прокси…
3. Что произойдет, если вы не будете использовать XmlSerializer, а вместо этого просто используете «Добавить ссылку на службу»? Использовали ли вы «Добавить веб-ссылку» раньше?
4. Я попытался использовать Add Service Reference, но почему-то он не распознал службу (я не могу инициировать или использовать функцию). Итак, я использовал веб-ссылку … :-s
Ответ №3:
Как вы добавляете WCF в свое клиентское приложение? Похоже, что это не имеет никакого отношения к Azure — это больше связано с тем, как вы определили свой [DataContract]
и как он импортируется в ваш клиентский код.
Я думаю, что если вы используете WCF на стороне клиента, то вы не увидите этих дополнительных параметров.
Смотрите возможное объяснение (или, возможно, связанную проблему) здесь — http://blogs.msdn.com/b/eugeneos/archive/2007/02/05/solving-the-disappearing-data-issue-when-using-add-web-reference-or-wsdl-exe-with-wcf-services.aspx
Ответ №4:
Добавьте или замените следующий код над вашим интерфейсом IService :
[ServiceContract ( Namespace="http://www.yoursite.com/"),XmlSerializerFormat]
Ответ №5:
У меня все работало нормально, как показано в приведенном ниже коде:
[ServiceContract]
[XmlSerializerFormat]
public interface IService1
{
// do code here
}
Ответ №6:
В вашем клиентском проекте убедитесь, что вы выбрали «Добавить ссылку на службу» вместо «Добавить веб-ссылку». ‘Add Service Reference’ использует WCF, в то время как ‘Add Web Reference’ нет, и компенсирует необязательные параметры путем добавления ‘[ParamName] Указанных’ дополнительных параметров.