接收 HTTP 响应时出现 WCF 错误

WCF error occurred while receiving the HTTP response

此题不重复,请仔细阅读。

我在同一个域的不同机器上有一个 WCF 服务和一个客户端。 WCF 服务具有以下操作合同:

[ServiceContract]
public interface IPatchService
{
    [OperationContract]
    List<PatchUpdateDTO> SearchForUpdates();

    [OperationContract]
    string InstallUpdates();
}

PatchUpdateDTO class:

[Serializable]
[DataContract]
public class PatchUpdateDTO
{
    [DataMember]
    private string UpdateId { get; }
    [DataMember]
    private string Title { get; }
    [DataMember]
    private string Description { get; }
}

请求侦听器的服务代码:

    Uri baseAddress = new Uri("http://localhost:8000/PatchManagementService");
    _selfHost = new ServiceHost(typeof(PatchService), baseAddress);

    try
    {
        _selfHost.AddServiceEndpoint(typeof(IPatchService), new WSHttpBinding(), "PatchService");

        ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
        smb.HttpGetEnabled = true;
        _selfHost.Description.Behaviors.Add(smb);
        _selfHost.Open();
    }
    catch (CommunicationException ce)
    {
    ...
    }

我已经在我的客户端应用程序中添加了服务引用。

客户端代码:

public class AgentCommunicationWCFProvider : IAgentComminicationProvider
{
    private readonly PatchServiceClient _patchManagementService;

    public AgentCommunicationWCFProvider()
    {
        _patchManagementService = new PatchServiceClient();
    }
    public string InstallUpdates()
    {
        return _patchManagementService.InstallUpdates();
    }

    public List<PatchUpdateDTO> SearchForUpdates()
    {
        return _patchManagementService.SearchForUpdates();
    }

}

客户端配置:

  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="WSHttpBinding_IPatchService" />
      </wsHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://someIpAddress:8000/PatchManagementService/PatchService"
          binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IPatchService"
          contract="PatchManagementServiceReference.IPatchService" name="WSHttpBinding_IPatchService">
        <identity>
          <userPrincipalName value="****" />
        </identity>
      </endpoint>
    </client>
  </system.serviceModel>

现在发生了一些奇怪的事情,当使用 InstallUpdates() 方法时,我得到一个 return 字符串并且它工作正常,但是当使用 SearchForUpdates() 方法时,假设 return List<PatchUpdateDTO>,我收到以下错误:

附加信息:接收 HTTP 响应时出错 http://someIpAddress:8000/PatchManagementService/PatchService。 这可能是由于服务端点绑定未使用 HTTP 协议。 这也可能是由于 HTTP 请求上下文被服务器中止 (可能是由于服务关闭)。有关详细信息,请参阅服务器日志。

知道为什么复杂对象有问题吗?

好的 - 我刚刚复制了您的代码并发现了以下更改:

  1. 删除 [Serializable] 属性。 如果你想使用 DataContract/DataMember 属性,否则保留它但是 删除 DataContract/DataMember ,所有属性将自动 序列化。
  2. 将所有属性的访问修饰符 'private' 更改为 public PatchUpdateDTO class 否则您将无法在客户端访问它们 申请。
  3. 将 setter set; 添加到 PatchUpdateDTO class 的所有属性 否则你将无法设置 PatchUpdateDTO class
  4. 之外的值
  5. 在客户端配置中,将 someIpAddress 更改为本地主机或 IP。 WCF服务所在的机器地址运行.

经过上述更改后,它可以在我的机器上运行,returns PatchUpdateDTO 对象列表。

希望这能解决您的问题。