繁体   English   中英

如何使用标头将对象序列化为string \ 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);
        }
    }
}

我已经排除了为请求添加更多数据的代码,因为它很长而且复杂(需要在发送之前实现IEndpointBehaviorIClientMessageInspector以“捕获”请求) - 但是目前作为一种解决方法我在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM