我正在使用第三方Web服务客户端(通过使用“添加服务引用”创建)来检索一些数据。
在用适当的数据填充Web服务对象之后,我们需要向 header 中添加一些数据(加密的密码和一些其他预定义的数据)
然后,我们使用标准的.net XmlSerializer
序列化发送到Web服务的每个请求。
但是,在序列化的结果中,我看不到请求的 header 。我搜索了很长时间,也找不到任何“打印”它们的方法。
这是一些示例代码:
Ibooking proxy = new BookingManager();
/* Init proxy Data...*/
GetAvailabilityRequest request = new GetAvailabilityRequest();
/*Fill more data on the request...*/
GetAvailabilityResponse response = proxy.GetAvailability(request); //Send request to the web service
var xmlString2 = response.Serialize(); //only body, no headers in the XML
/* Extension class to Serialize any object */
public static class ExtensionUtil
{
public static string Serialize<T>(this T value)
{
try
{
XmlSerializer xmlserializer = new XmlSerializer(typeof(T));
var stringWriter = new StringWriter();
using (var writer = XmlWriter.Create(stringWriter))
{
xmlserializer.Serialize(writer, value);
return stringWriter.ToString();
}
}
catch (Exception ex)
{
throw new Exception("An error occurred", ex);
}
}
}
我已经排除了向请求添加更多数据的代码,因为它又长又复杂(需要在发送请求之前实现
IEndpointBehavior
和IClientMessageInspector
来“捕获”请求)-但目前,作为一种解决方法,我在Message对象上放置了BreakPoint并使用Visual Studio将其转换为字符串。这样,我确实看到了 header ,但是显然这是一个坏习惯,因为我希望它在序列化中是自动化的。 最佳答案
我想看一个如何添加这些标题的示例。
在大多数Web服务中,消息正文是序列化为XML或JSON的部分-报头不是。
您可以使用Fiddler和通过对web.config进行少量更改而实现的代理来检查服务调用,如本文http://weblog.west-wind.com/posts/2008/Mar/14/Debugging-Http-or-Web-Services-Calls-from-ASPNET-with-Fiddler所述。
简短的版本是将以下内容添加到您的web.config或app.config中:
<system.net>
<defaultProxy>
<proxy proxyaddress="http://127.0.0.1:8888" />
</defaultProxy>
</system.net>
在调用服务时下载并运行Fiddler,您应该可以看到并能够检查Fiddler中的调用。
如果要检查和/或修改代码库中的 header ,则可以考虑实现IClientMessageInspector或IDispatchMessageInspector。以下是有关该主题的几篇文章:
https://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.iclientmessageinspector(v=vs.100).aspx
http://weblogs.asp.net/paolopia/writing-a-wcf-message-inspector
这是我所做的一个实现。我不需要访问 header ,而是需要修改由服务客户端创建的xml namespace ,但是它应该使您了解如何执行实现:How can I create custom XML namespace attributes when consuming a legacy SOAP service?