c# - 警告 : The optional WSDL extension element 'body' from namespace 'http://schemas.xmlsoap.org/wsdl/soap/' was not handled

标签 c# silverlight wcf wsdl

我正在使用 Visual Studio 2010、.Net4、Silverlight(4.0.50826.0)。

我创建了一个 WCF 服务,我正在尝试使用 SlSvcUtil 创建一个代理,例如:

SlSvcUtil.exe /serializer:DataContractSerializer http://192.128.09.26:8080/Server?wsdl /out:C:\Projets\Client\dService.cs /config:C:\Projets\Client\ServiceReferences.ClientConfig

当我添加一些带有客户类型的方法并且它们也有一些属性时,我得到了这个消息:

Warning: The optional WSDL extension element 'body' from namespace 'http://schemas.xmlsoap.org/wsdl/soap/' was not handled.

XPath: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:binding[@ name='BasicHttpBinding_IService']/wsdl:operation[@name='GetDefinitionsHavingFre']/wsdl:output

如果我忽略警告并尝试使用该类,那么在调用任何方法时都会出现 NullException 错误。

如果我更改选项 /Serializer:XmlSerializer 或任何其他选项它可能会正确创建代理但我在 visual studio 中得到很多空引用,因此有必要添加正确的 .

如果我添加:来自 Silverlight 的 System.ServiceModel - xmlserializerformatattribute 不存在 System.ServiceModel 来自 .NET - ChannelBase 不存在

如果我没有使用客户方法,我的服务就可以正常工作,所以我的问题是在使用客户类型或带有属性的方法时,silverlight 有一些限制吗?

有人知道可以做些什么来解决这个问题吗?

谢谢,

WSDL:

<?xml version="1.0" encoding="utf-8" ?> 
- <wsdl:definitions name="TestService" targetNamespace="http://tempuri.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:tns="http://tempuri.org/" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:wsa10="http://www.w3.org/2005/08/addressing" xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex">
- <wsdl:types>
- <xsd:schema targetNamespace="http://tempuri.org/Imports">
  <xsd:import schemaLocation="http://192.128.09.26:8080/Server?xsd=xsd0" namespace="http://tempuri.org/" /> 
  <xsd:import schemaLocation="http://192.128.09.26:8080/Server?xsd=xsd1" namespace="http://schemas.microsoft.com/2003/10/Serialization/" /> 
  <xsd:import schemaLocation="http://192.128.09.26:8080/Server?xsd=xsd10" namespace="http://schemas.datacontract.org/2004/07/DataCompany.Data.Faults" /> 
  <xsd:import schemaLocation="http://192.128.09.26:8080/Server?xsd=xsd2" namespace="http://schemas.datacontract.org/2004/07/DataCompany.Data.PortalModel" /> 
  <xsd:import schemaLocation="http://192.128.09.26:8080/Server?xsd=xsd3" namespace="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses" /> 
  <xsd:import schemaLocation="http://192.128.09.26:8080/Server?xsd=xsd4" namespace="http://schemas.datacontract.org/2004/07/System.Data" /> 
  <xsd:import schemaLocation="http://192.128.09.26:8080/Server?xsd=xsd5" namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays" /> 
  <xsd:import schemaLocation="http://192.128.09.26:8080/Server?xsd=xsd6" namespace="http://schemas.datacontract.org/2004/07/DataCompany.Data.Components" /> 
  <xsd:import schemaLocation="http://192.128.09.26:8080/Server?xsd=xsd7" namespace="http://schemas.datacontract.org/2004/07/System" /> 
  <xsd:import schemaLocation="http://192.128.09.26:8080/Server?xsd=xsd8" namespace="http://schemas.datacontract.org/2004/07/DataCompany.Data" /> 
  <xsd:import schemaLocation="http://192.128.09.26:8080/Server?xsd=xsd9" namespace="http://schemas.datacontract.org/2004/07/DataCompany.Data.LocalizationManagement" /> 
  </xsd:schema>
  </wsdl:types>
- <wsdl:message name="ITestService_StatusService_InputMessage">
  <wsdl:part name="parameters" element="tns:StatusService" /> 
  </wsdl:message>
- <wsdl:message name="ITestService_StatusService_OutputMessage">
  <wsdl:part name="parameters" element="tns:StatusServiceResponse" /> 
  </wsdl:message>
- <wsdl:message name="ITestService_getData_InputMessage">
  <wsdl:part name="parameters" element="tns:getData" /> 
  </wsdl:message>
- <wsdl:message name="ITestService_getData_OutputMessage">
  <wsdl:part name="parameters" element="tns:getDataResponse" /> 
  </wsdl:message>
- <wsdl:message name="ITestService_getTime_InputMessage">
  <wsdl:part name="parameters" element="tns:getTime" /> 
  </wsdl:message>
- <wsdl:message name="ITestService_getTime_OutputMessage">
  <wsdl:part name="parameters" element="tns:getTimeResponse" /> 
  </wsdl:message>
- <wsdl:message name="ITestService_getText_InputMessage">
  <wsdl:part name="parameters" element="tns:getText" /> 
  </wsdl:message>
- <wsdl:message name="ITestService_getText_OutputMessage">
  <wsdl:part name="parameters" element="tns:getTextResponse" /> 
  </wsdl:message>
- <wsdl:message name="ITestService_SaveEntity_InputMessage">
  <wsdl:part name="parameters" element="tns:SaveEntity" /> 
  </wsdl:message>
- <wsdl:message name="ITestService_SaveEntity_OutputMessage">
  <wsdl:part name="parameters" element="tns:SaveEntityResponse" /> 
  </wsdl:message>
- <wsdl:message name="ITestService_SaveEntity_DatabaseFaultFault_FaultMessage">
  <wsdl:part name="detail" element="q1:DatabaseFault" xmlns:q1="http://schemas.datacontract.org/2004/07/DataCompany.Data.Faults" /> 
  </wsdl:message>
- <wsdl:portType name="ITestService">
- <wsdl:operation name="StatusService">
  <wsdl:input wsaw:Action="http://tempuri.org/ITestService/StatusService" message="tns:ITestService_StatusService_InputMessage" /> 
  <wsdl:output wsaw:Action="http://tempuri.org/ITestService/StatusServiceResponse" message="tns:ITestService_StatusService_OutputMessage" /> 
  </wsdl:operation>
- <wsdl:operation name="getData">
  <wsdl:input wsaw:Action="http://tempuri.org/ITestService/getData" message="tns:ITestService_getData_InputMessage" /> 
  <wsdl:output wsaw:Action="http://tempuri.org/ITestService/getDataResponse" message="tns:ITestService_getData_OutputMessage" /> 
  </wsdl:operation>
- <wsdl:operation name="getTime">
  <wsdl:input wsaw:Action="http://tempuri.org/ITestService/getTime" message="tns:ITestService_getTime_InputMessage" /> 
  <wsdl:output wsaw:Action="http://tempuri.org/ITestService/getTimeResponse" message="tns:ITestService_getTime_OutputMessage" /> 
  </wsdl:operation>
- <wsdl:operation name="getText">
  <wsdl:input wsaw:Action="http://tempuri.org/ITestService/getText" message="tns:ITestService_getText_InputMessage" /> 
  <wsdl:output wsaw:Action="http://tempuri.org/ITestService/getTextResponse" message="tns:ITestService_getText_OutputMessage" /> 
  </wsdl:operation>
- <wsdl:operation name="SaveEntity">
  <wsdl:input wsaw:Action="http://tempuri.org/ITestService/SaveEntity" message="tns:ITestService_SaveEntity_InputMessage" /> 
  <wsdl:output wsaw:Action="http://tempuri.org/ITestService/SaveEntityResponse" message="tns:ITestService_SaveEntity_OutputMessage" /> 
  <wsdl:fault wsaw:Action="http://tempuri.org/ITestService/SaveEntityDatabaseFaultFault" name="DatabaseFaultFault" message="tns:ITestService_SaveEntity_DatabaseFaultFault_FaultMessage" /> 
  </wsdl:operation>
  </wsdl:portType>
- <wsdl:binding name="BasicHttpBinding_ITestService" type="tns:ITestService">
  <soap:binding transport="http://schemas.xmlsoap.org/soap/http" /> 
- <wsdl:operation name="StatusService">
  <soap:operation soapAction="http://tempuri.org/ITestService/StatusService" style="document" /> 
- <wsdl:input>
  <soap:body use="literal" /> 
  </wsdl:input>
- <wsdl:output>
  <soap:body use="literal" /> 
  </wsdl:output>
  </wsdl:operation>
- <wsdl:operation name="getData">
  <soap:operation soapAction="http://tempuri.org/ITestService/getData" style="document" /> 
- <wsdl:input>
  <soap:body use="literal" /> 
  </wsdl:input>
- <wsdl:output>
  <soap:body use="literal" /> 
  </wsdl:output>
  </wsdl:operation>
- <wsdl:operation name="getTime">
  <soap:operation soapAction="http://tempuri.org/ITestService/getTime" style="document" /> 
- <wsdl:input>
  <soap:body use="literal" /> 
  </wsdl:input>
- <wsdl:output>
  <soap:body use="literal" /> 
  </wsdl:output>
  </wsdl:operation>
- <wsdl:operation name="getText">
  <soap:operation soapAction="http://tempuri.org/ITestService/getText" style="document" /> 
- <wsdl:input>
  <soap:body use="literal" /> 
  </wsdl:input>
- <wsdl:output>
  <soap:body use="literal" /> 
  </wsdl:output>
  </wsdl:operation>
- <wsdl:operation name="SaveEntity">
  <soap:operation soapAction="http://tempuri.org/ITestService/SaveEntity" style="document" /> 
- <wsdl:input>
  <soap:body use="literal" /> 
  </wsdl:input>
- <wsdl:output>
  <soap:body use="literal" /> 
  </wsdl:output>
- <wsdl:fault name="DatabaseFaultFault">
  <soap:fault name="DatabaseFaultFault" use="literal" /> 
  </wsdl:fault>
  </wsdl:operation>
  </wsdl:binding>
- <wsdl:service name="TestService">
- <wsdl:port name="BasicHttpBinding_ITestService" binding="tns:BasicHttpBinding_ITestService">
  <soap:address location="http://192.128.09.26:8080/Server" /> 
  </wsdl:port>
  </wsdl:service>
  </wsdl:definitions>

最佳答案

我发现了问题。

在使用 SlSvcUtil 创建代理并在我的 Visual Studio 项目中添加 .cs 后,我得到了这个错误:

The type or namespace name 'XmlSerializerFormatAttributeAttribute' does not exist in the namespace 'System.ServiceModel' (are you missing an assembly reference?)

首先,我尝试将 System.Service.Model 从 Silverlight 版本更改为 .Net 版本,但我遇到了其他错误。

所以我找到了需要的地方,在SlSvcUtil中使用/serializer:DataContractSerializer;之后这个错误就解决了。但是,当生成代理时,我收到了 WSDL 警告。

解决方案

  1. 我使用以下命令创建了代理:

    SlSvcUtil.exe http://192.128.09.26:8080/Server /out:C:\Projets\Client\dService.cs /config:C:\Projets\Client\ServiceReferences.ClientConfig
    

    然后我在 Visual Studio 中得到了这个错误:

    The type or namespace name 'XmlSerializerFormatAttributeAttribute' does not exist in the namespace 'System.ServiceModel' (are you missing an assembly reference?)

  2. 我添加了以下 dll:

    • System.Xml.Serialization.dll -(运行时版本 v2.0.50727)

结论

Visual Studio 无法在 ServiceModel.dll 中找到引用,而 ServiceModel 在那里,所以我从没想过要添加另一个 .dll,因为已经添加了正确的 dll。

就在昨天,我尝试添加 System.Xml.Serialization.dll,现在一切正常。

关于c# - 警告 : The optional WSDL extension element 'body' from namespace 'http://schemas.xmlsoap.org/wsdl/soap/' was not handled,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5553618/

相关文章:

c# - WCF错误: The socket connection was aborted

wcf - 将数据放入 WCF RESTful 服务时出现 HTTP 400 错误请求 - 最大请求大小低?

C# text.Replace 保留大小写

c# - 具有 Silverlight 序列化属性的 ReflectionTypeLoadException

c# - SignalR 客户端每两秒重新连接到集线器

sql-server - CRM 2011 Silverlight 存储过程

c# - 在 Silverlight 应用程序中使用 "dynamic"关键字时出错

c# - 我如何每两周在星期一和星期二运行 quartz 计划?

c# - 在 C# 中,如何在两个项目之间进行选择?

c# - "Attributes"到底是什么?