这个问题没有重复,请仔细阅读。
我在同一个域的不同计算机上有一个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请求上下文 (可能由于服务关闭)。有关详细信息,请参阅服务器日志。
任何有关复杂对象出现问题的想法?
答案 0 :(得分:1)
好的 - 我刚刚复制了您的代码并发现了以下更改:
[Serializable]
属性。
如果要使用DataContract / DataMember属性,请保留它
删除DataContract / DataMember,所有属性都将自动进行
serialisable。 'private'
更改为public
以获取所有属性
PatchUpdateDTO
类,否则您将无法在客户端访问它们
应用set;
添加到PatchUpdateDTO
类的所有属性中
否则你将无法设置PatchUpdateDTO
class 经过上述更改后,它可以在我的机器上运行并返回PatchUpdateDTO对象列表。
希望这能解决你的问题。