如何使用标头将对象序列化为string\xml

Dar*_*dar 6 c# serialization web-services

我正在使用第三方Web服务客户端(使用"添加服务引用"创建)以检索某些数据.

在使用适当的数据填充Web服务对象后,我们需要向标头添加一些数据(加密密码和一些其他预定义数据)

然后,我们使用标准.net序列化发送到Web服务的每个请求XmlSerializer.

但是,在序列化的结果中,我没有看到请求的标头.我已经搜索了很长时间,也找不到任何方法来"打印"它们.

这是一些示例代码:

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经排除了为请求添加更多数据的代码,因为它很长而且复杂(需要在发送之前实现IEndpointBehaviorIClientMessageInspector"捕获"请求) - 但是目前作为一种解决方法我在Message对象上放置了一个BreakPoint并进行转换使用Visual Studio将其转换为字符串.通过这种方式,我确实看到了标题,但显然这是不好的做法,因为我希望它在序列化中自动化.

Joh*_*yer 0

我想看看如何添加这些标头的示例。

在大多数 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>
Run Code Online (Sandbox Code Playgroud)

在调用服务时下载并运行 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 命名空间,但它应该让您了解如何实现:How can I create custom XML namespace attribute when using a Legacy SOAP service ?