簡體   English   中英

如何在netcore中將soap xml作為webservice客戶端進行跟蹤?

[英]how to trace soap xml as a webservice client in netcore?

下面的代碼是使用 vs. 自動生成的。

[System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(response))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(request))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(product[]))]
System.Threading.Tasks.Task<PartnerService.cancelOrderResponse> cancelOrderAsync(PartnerService.cancelOrderRequest1 request);
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
System.Threading.Tasks.Task<PartnerService.cancelOrderResponse> PartnerService.PartnerServicePortType.cancelOrderAsync(PartnerService.cancelOrderRequest1 request)
{
    return base.Channel.cancelOrderAsync(request);
}

netcore 中沒有soapExtensionAttribute 類。 它只存在於網絡框架中。 所以我不知道 netcore 中的屬性是什么。

創建兩個類文件

    public class InspectorBehavior : IEndpointBehavior
    {
        public string LastRequestXML
        {
            get
            {
                return myMessageInspector.LastRequestXML;
            }
        }

        public string LastResponseXML
        {
            get
            {
                return myMessageInspector.LastResponseXML;
            }
        }

        public int TimeSpan { 
            get {
                return myMessageInspector.TimeSpan;
            } 
        }
        public int ResponseCode { get { return myMessageInspector.ResponseCode; } }

        public string URL { get { return myMessageInspector.URL; } }

        private MyMessageInspector myMessageInspector = new MyMessageInspector();
        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.ClientMessageInspectors.Add(myMessageInspector);
        }
    }

    public class MyMessageInspector : IClientMessageInspector
    {
        public string LastRequestXML { get; private set; }
        public string LastResponseXML { get; private set; }

        public int TimeSpan { get; private set; }

        public int ResponseCode { get; private set; }

        public string URL { get; private set; }

        private Stopwatch stopwatch { get; set; }

        public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
        {
            stopwatch.Stop();
            LastResponseXML = reply.ToString();
            this.TimeSpan = (int)stopwatch.Elapsed.TotalSeconds;
        }

        public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel)
        {
            LastRequestXML = request.ToString();
            URL = channel.RemoteAddress.Uri.AbsoluteUri;
            stopwatch = new Stopwatch();
            stopwatch.Start();
            return request;
        }
    }

當客戶打電話

var requestInterceptor = new InspectorBehavior();
this.soapClient.Endpoint.EndpointBehaviors.Add(requestInterceptor);
await this.soapClient.cancelOrderAsync(...);
Console.WriteLine(requestInsterceptor.LastRequestXML);
Console.WriteLine(requestInsterceptor.LastResponseXML);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM