【问题标题】:How to read WCF Soap Response from WCF Server Code?如何从 WCF 服务器代码读取 WCF Soap 响应?
【发布时间】:2015-09-05 02:45:45
【问题描述】:

我已经浏览了我在这个站点上可以找到的所有相关帖子,并且我已经搜索了互联网......我很困惑如何在 WCF 的 SOAP 响应将其发送回客户端之前读取它。

我想读取最终形式的响应(XML 中包含肥皂信封元素)并将其发送到我的自定义日志过程。

请注意,我必须使用提供的自定义日志函数,该函数接受作为字符串的响应并将其发送到 SQL 数据库(未显示)。这必须由代码在运行时为每个响应处理;我不能简单地使用一些第 3 方记录/跟踪工具。

这是我的 WCF 服务代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
using MSADataAccess;
using System.Web.Configuration;
using System.ServiceModel.Channels;

namespace svcIDIVS
{
    public class VINS : IVINS
    {

        public string VerifyInsurance(string coverageRequest)
        {
            string responseMessage = null;
            DataAccess da = new DataAccess();
            responseMessage = da.VerifyInsurance(coverageRequest);
            return responseMessage;
        }
    }
}

我需要将 responseMessage 连同它的 SOAP 信封一起读入一个字符串。它应该看起来像这样:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Header />
  <s:Body>
    <VerifyInsuranceResponse xmlns="http://tempuri.org/">
      <VerifyInsuranceResult>&lt;CoverageResponseDocument PublicationVersion="00200809" PublicationDate="2008-11-05" xmlns="http://www.iicmva.com/CoverageVerification/"&gt;  
    &lt;Detail&gt;  
        &lt;PolicyInformation&gt;  
            &lt;CoverageStatus&gt;  
                &lt;ResponseDetails&gt;  
                    &lt;ResponseCode&gt;Unconfirmed&lt;/ResponseCode&gt;  
                    &lt;UnconfirmedReasonCode&gt;VIN2&lt;/UnconfirmedReasonCode&gt;  
                &lt;/ResponseDetails&gt;  
            &lt;/CoverageStatus&gt;  
            &lt;OrganizationDetails&gt;   
                &lt;NAIC&gt;14788&lt;/NAIC&gt;  
                &lt;!-- this can be echoed from the request or provide the actual NAIC that has evidence of coverage --&gt;  
            &lt;/OrganizationDetails&gt;  
            &lt;PolicyDetails&gt;  
                &lt;!-- this section can be echoed from the request --&gt;  
                &lt;VerificationDate&gt;07/16/2008 00:00:00&lt;/VerificationDate&gt;  
                &lt;PolicyKey&gt;03K85845&lt;/PolicyKey&gt;  
                &lt;PolicyState&gt;CT&lt;/PolicyState&gt;  
            &lt;/PolicyDetails&gt;  
        &lt;/PolicyInformation&gt;  
    &lt;/Detail&gt;  
&lt;/CoverageResponseDocument&gt;  
</VerifyInsuranceResult>
    </VerifyInsuranceResponse>
  </s:Body>

【问题讨论】:

    标签: c# wcf


    【解决方案1】:

    WCF 有Message Dispatcher Inspector,您可以在其中拦截消息并在发送/回复您的服务之前进行验证。

    public class BodMessageInspector : IDispatchMessageInspector
        {
            public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
            {
                return instanceContext;
            }
    
            public void BeforeSendReply(ref Message reply, object correlationState)
            {
                // DO your stuff here and validate your reply Message
            }
        }
    

    【讨论】:

    • 我到处都能看到这段代码,但我不知道如何传入我的服务代码正在使用的现有参数。我上面显示的服务代码如何让现有的 Message 和 correlationState 传递到 BeforeSendReply ?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    • 2012-03-18
    相关资源
    最近更新 更多