具有返回类型DataSet的WCF服务端点在ASP.net站点中客户端需要null响应时返回空DataSet

时间:2018-03-22 19:36:51

标签: c# .net web-services wcf

我有一个现有的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]));
    }

此外:

  • System.Net.Cookie正确返回null,如果不为null,则正确传递对象。
  • 字符串有效。
  • 列表转换为bool []但也有效。
  • &#39;元组LT; ?,&GT;&#39;被制作成自定义对象但是有效。

似乎DataSet是唯一有这个怪癖的东西。

0 个答案:

没有答案