![](/img/trans.png)
[英]How to serialize/de-serialize a Dictionary<string, object> into XML
[英]How to serialize an object into string\xml with its headers
我正在使用第三方Web服务客户端(使用“添加服务引用”创建)以检索某些数据。
在使用适当的数据填充Web服务对象后,我们需要向标头添加一些数据(加密密码和一些其他预定义数据)
然后,我们使用标准的.net XmlSerializer
序列化发送到Web服务的每个请求。
但是,在序列化的结果中,我没有看到请求的标头。 我已经搜索了很长时间,也找不到任何方法来“打印”它们。
这是一些示例代码:
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将其转换为字符串。 通过这种方式,我确实看到了标题,但显然这是不好的做法,因为我希望它在序列化中自动化。
我想看一个如何添加这些标头的示例。
在大多数Web服务中,消息体是序列化为XML或JSON的部分 - 标题不是。
您可以使用Fiddler检查服务调用,并通过web.config中的一个小更改实现代理,如本文所述: http : //weblog.west-wind.com/posts/2008/Mar/14 / Debugging-Http-or-Web-Services-来自ASPNET-with-Fiddler的调用 。
简短版本是将以下内容添加到web.config或app.config中:
<system.net>
<defaultProxy>
<proxy proxyaddress="http://127.0.0.1:8888" />
</defaultProxy>
</system.net>
在调用服务时下载并运行Fiddler,您应该看到并能够在Fiddler中检查该调用。
如果要检查和/或修改代码库中的标头,可以查看实现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-消息督察
这是我做的一个实现。 我不需要访问头文件,而是修改服务客户端创建的xml命名空间,但它应该让你知道如何实现: 如何在使用传统SOAP服务时创建自定义XML命名空间属性?
OperationContext是你的朋友。 使用OperationContextScope包装对服务的调用,然后使用OperationContext.Current来获取所需的所有隐藏的东西。
https://msdn.microsoft.com/en-us/library/system.servicemodel.operationcontextscope(v=vs.110).aspx
请注意,您需要知道要获取的标头的特定类型,如果在使用时未标记为可序列化,我在获取标头的值而不仅仅是名称方面遇到了一些问题XmlSerializer的
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.