我正在使用第三方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);
        }
    }
}

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

10-07 19:42
查看更多