我有一个现有的ASMX服务,我正在转换为WCF,我有一个返回DataSet的端点。客户端连接到服务,就像它是ASMX一样,它适用于它需要的大多数情况。我遇到的一个失败是期望来自调用的响应为null,但是当WCF服务返回null时,客户端应用程序正在将其转换为空的DataSet,这在客户端代码中没有被正确处理。
当客户端将服务添加为服务引用时,而不是Web引用,它可以正常工作,null就像预期的那样回归并且非常棒。但要求是使用新端点将服务保留为Web引用。
以下是Soap提供的示例空响应。
新WCF
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<ActivityId CorrelationId="d50c1406-ca52-4b8a-9588-94b25d1767d4" xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics">00000000-0000-0000-0000-000000000000</ActivityId>
</s:Header>
<s:Body>
<HeartbeatResponse xmlns="http://tempuri.org/">
<HeartbeatResult i:nil="true" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"/>
</HeartbeatResponse>
</s:Body>
</s:Envelope>
旧ASMX
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<HeartbeatResponse xmlns="http://tempuri.org/"/>
</soap:Body>
</soap:Envelope>
有没有办法可以让WCF服务模仿ASMX在null情况下回复的响应?
这只是某些应用程序中的问题。到目前为止,我测试的所有其他应用程序都已正确地将响应视为空。问题应用程序是一个ASP.net站点。
客户端代码中的一个请求的示例
protected void HeartBeat()
{
DataSet ds;
ds = service.Heartbeat();
if (PopulateGridView(ds)) { }
else EmptyGridview();
}
和服务Reference.cs经历
[System.Web.Services.Protocols.SoapHeaderAttribute("AuthHeaderValue")]
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/Heartbeat", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
[return: System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
public System.Data.DataSet Heartbeat() {
object[] results = this.Invoke("Heartbeat", new object[0]);
return ((System.Data.DataSet)(results[0]));
}
此外:
似乎DataSet是唯一有这个怪癖的东西。