收到HTTP响应时出现WCF错误

时间:2017-04-05 13:35:07

标签: c# wcf wcf-binding

这个问题没有重复,请仔细阅读。

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

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

    [OperationContract]
    string InstallUpdates();
}

PatchUpdateDTO上课:

[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()方法时,我得到一个返回字符串,它工作正常,但是当使用SearchForUpdates()方法时,假设返回List<PatchUpdateDTO>,我得到以下内容错误:

其他信息:收到HTTP响应时发生错误 HTTP:// someIpAddress :8000 / PatchManagementService / PatchService。 这可能是由于服务端点绑定不使用HTTP协议。 这也可能是由于服务器中止了HTTP请求上下文 (可能由于服务关闭)。有关详细信息,请参阅服务器日志。

任何有关复杂对象出现问题的想法?

1 个答案:

答案 0 :(得分:1)

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

  1. 摆脱[Serializable]属性。 如果要使用DataContract / DataMember属性,请保留它 删除DataContract / DataMember,所有属性都将自动进行 serialisable。
  2. 将访问修饰符'private'更改为public以获取所有属性 PatchUpdateDTO类,否则您将无法在客户端访问它们  应用
  3. 将setter set;添加到PatchUpdateDTO类的所有属性中 否则你将无法设置PatchUpdateDTO class
  4. 之外的值
  5. 在客户端配置上,将 someIpAddress 更改为localhost或IP。 正在运行WCF服务的计算机的地址。
  6. 经过上述更改后,它可以在我的机器上运行并返回PatchUpdateDTO对象列表。

    希望这能解决你的问题。