* Результат и * Определенные для результата параметры в службе WCF?

#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] Указанных’ дополнительных параметров.