接收 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 请求上下文被服务器中止
(可能是由于服务关闭)。有关详细信息,请参阅服务器日志。
知道为什么复杂对象有问题吗?
好的 - 我刚刚复制了您的代码并发现了以下更改:
- 删除
[Serializable]
属性。
如果你想使用 DataContract/DataMember 属性,否则保留它但是
删除 DataContract/DataMember ,所有属性将自动
序列化。
- 将所有属性的访问修饰符
'private'
更改为 public
PatchUpdateDTO
class 否则您将无法在客户端访问它们
申请。
- 将 setter
set;
添加到 PatchUpdateDTO
class 的所有属性
否则你将无法设置 PatchUpdateDTO
class 之外的值
- 在客户端配置中,将 someIpAddress 更改为本地主机或 IP。
WCF服务所在的机器地址运行.
经过上述更改后,它可以在我的机器上运行,returns PatchUpdateDTO 对象列表。
希望这能解决您的问题。
此题不重复,请仔细阅读。
我在同一个域的不同机器上有一个 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 请求上下文被服务器中止 (可能是由于服务关闭)。有关详细信息,请参阅服务器日志。
知道为什么复杂对象有问题吗?
好的 - 我刚刚复制了您的代码并发现了以下更改:
- 删除
[Serializable]
属性。 如果你想使用 DataContract/DataMember 属性,否则保留它但是 删除 DataContract/DataMember ,所有属性将自动 序列化。 - 将所有属性的访问修饰符
'private'
更改为public
PatchUpdateDTO
class 否则您将无法在客户端访问它们 申请。 - 将 setter
set;
添加到PatchUpdateDTO
class 的所有属性 否则你将无法设置PatchUpdateDTO
class 之外的值
- 在客户端配置中,将 someIpAddress 更改为本地主机或 IP。 WCF服务所在的机器地址运行.
经过上述更改后,它可以在我的机器上运行,returns PatchUpdateDTO 对象列表。
希望这能解决您的问题。