Skip to main content
 首页 » 编程设计

.net之在将 SOAP 消息发送到 .NET 中的 WebService 之前获取它

2025年05月04日128leader

我正在调用外部 HTTPS 网络服务。

为了检查出了什么问题,所有者需要我发送的 SOAP 请求。

我有一个 Web 引用和 VS 2008 生成的代理类...

有没有办法在发送之前查看 SOAP 消息?

我正在考虑一些 .net 代码......因为我尝试的嗅探器没有“看到”网络服务调用不知道为什么。

请您参考如下方法:

您可以使用 IClientMEssageInspector 和 IEndpointBehavior 来完成此操作。我发现使用这种方式可以像 fiddler 一样捕获确切的 SOAP ​​请求:

在同一个项目中创建一个这样的类:

public class ClientMessageInspector : System.ServiceModel.Dispatcher.IClientMessageInspector 
    { 
        #region IClientMessageInspector Members 
        public string LastRequestXml { get; private set; } 
 
        public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState) 
        { 
 
        } 
 
        public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel) 
        { 
            string requestHeaderName = request.Headers.Action.Replace("urn:#",string.Empty); 
            LastRequestXml = request.ToString(); 
            string serializedRequestFile = string.Format(requestHeaderName + "_request_{0}.xml", DateTime.Now.ToString("yyyyMMddHHmmss")); 
            string exportedFolder = ConfigurationManager.AppSettings["SubmittedRequestXmLocation"]; 
            printSoapRequest(request, exportedFolder, serializedRequestFile); 
 
            return request; 
        } 
 
        public void printSoapRequest(System.ServiceModel.Channels.Message request, string exportedFolder, string fileName) 
        { 
            if (exportedFolder.Equals(string.Empty)) 
                return; 
 
            if (!Directory.Exists(exportedFolder)) 
            { 
                Directory.CreateDirectory(exportedFolder); 
            } 
            string exportedFile = string.Format("{0}\\{1}", exportedFolder, fileName); 
            if (File.Exists(exportedFile)) 
            { 
                File.Delete(exportedFile); 
            } 
 
            string strRequestXML = request.ToString(); 
            XDocument xDoc = XDocument.Parse(strRequestXML); 
            XmlWriter xw = XmlWriter.Create(exportedFile); 
            xDoc.Save(xw); 
            xw.Flush(); 
            xw.Close(); 
            LogOutput("Request file exported: " + exportedFile); 
 
        } 
 
    } 
 
    public class CustomInspectorBehavior : IEndpointBehavior 
    { 
        private readonly ClientMessageInspector clientMessageInspector = new ClientMessageInspector(); 
 
        public string LastRequestXml 
        { 
            get { return clientMessageInspector.LastRequestXml; } 
        } 
 
        public string LastResponseXml 
        { 
            get { return clientMessageInspector.LastRequestXml; } 
        } 
 
        public void AddBindingParameters( 
            ServiceEndpoint endpoint, 
            System.ServiceModel.Channels.BindingParameterCollection bindingParameters) 
        { 
        } 
 
        public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) 
        { 
        } 
 
        public void Validate(ServiceEndpoint endpoint) 
        { 
        } 
 
        public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime) 
        { 
            clientRuntime.MessageInspectors.Add(clientMessageInspector); 
        } 
    } 

然后你可以像下面这样调用它:
ProxyClass _class = new ProxyClass(); 
var requestInterceptor = new CustomInspectorBehavior(); 
           _client.Endpoint.Behaviors.Add(requestInterceptor); 

当你调用服务方法时,它会自动执行拦截器并打印输出。使用这种方式,您还可以在发送到服务器之前操作 SOAP 消息!