2016-05-18 38 views
0

第一個代碼塊返回一個很好的請求。第二個返回錯誤。請指教。無法讓WCF WebCannelFactory BeforeSendRequest正常工作

第一個代碼塊返回有關客戶的信息,並使用OAuth2。第二塊使用攔截器。問題是,當我使用WebChannelFactory並在跟蹤中查看我的請求時,它顯示(與請求的好處相比)所有內容(請求的主體)都放入消息塊中。在一個很好的請求中,我的請求的主體被放入肥皂信息中。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.ServiceModel; 
using System.ServiceModel.Channels; 
using System.Text; 
using System.Threading.Tasks; 

namespace Ahcccs.Isd.Aes.Breaz.Core.WCF.SOAP 
{ 
    public class ConsumeGetVendorLookup 
    { 
     public void Consume(string wso2token) 
     { 
      Header header = new Header(); 
      header.Type = "?"; 
      header.ReturnCode = "?"; 
      header.Requestor = "?"; 
      header.Recipient = "?"; 
      header.Date = "?"; 
      Requestor requestor = new Requestor(); 
      requestor.UserID = ""; 
      requestor.Password = ""; 

      header.Subject = requestor; 

      Payload payload = new Payload(); 
      GetVendorCustomerIn getVendorCustomer = new GetVendorCustomerIn(); 
      getVendorCustomer.IncludeGeneralInfo = true; 
      getVendorCustomer.IncludeHeadquarters = true; 
      getVendorCustomer.IncludePrenote_EFT = true; 
      getVendorCustomer.IncludePrenote_EFTSpecified = true; 
      getVendorCustomer.Vendor_Customer = "{our customer number}"; 

      payload.GetVendorCustomerIn = getVendorCustomer; 

      AdvMessage advMessage = new AdvMessage(); 
      advMessage.Header = header; 
      advMessage.Payload = payload; 

      GetVendorCustomer customer = new GetVendorCustomer(); 
      customer.AdvMessage = advMessage; 

      VendorServicesClient wcfClient = new VendorServicesClient(); 
      var s = wcfClient.State; 
      wcfClient.Open(); 

      using (new OperationContextScope(wcfClient.InnerChannel)) 
      { 
       WebProxy wproxy = new WebProxy(new Uri("http://{our proxy server and port}"), true); 
       wproxy.BypassProxyOnLocal = true; 
       wproxy.UseDefaultCredentials = true; 

       WebRequest.DefaultWebProxy = wproxy; 

       // Add a HTTP Header to an outgoing request  
       HttpRequestMessageProperty requestMessage = new HttpRequestMessageProperty(); 
       requestMessage.Headers["Authorization"] = " Bearer " + wso2token; 

       OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestMessage; 

       var result = wcfClient.getVendorCustomer(customer); 
      } 
     } 
    } 
} 

這個方法返回一個錯誤:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.ServiceModel; 
using System.ServiceModel.Channels; 
using System.ServiceModel.Description; 
using System.ServiceModel.Dispatcher; 
using System.ServiceModel.Web; 
using System.Text; 
using System.Threading.Tasks; 

namespace Ahcccs.Isd.Aes.Breaz.Core.WCF.SOAP 
{ 
    public class ConsumeGetVendorLookup 
    { 
     public void Consume(string wso2token) 
     { 
      Header header = new Header(); 
      header.Type = "?"; 
      header.ReturnCode = "?"; 
      header.Requestor = "?"; 
      header.Recipient = "?"; 
      header.Date = "?"; 
      Requestor requestor = new Requestor(); 
      requestor.UserID = ""; 
      requestor.Password = ""; 

      header.Subject = requestor; 

      Payload payload = new Payload(); 
      GetVendorCustomerIn getVendorCustomer = new GetVendorCustomerIn(); 
      getVendorCustomer.IncludeGeneralInfo = true; 
      getVendorCustomer.IncludeHeadquarters = true; 
      getVendorCustomer.IncludePrenote_EFT = true; 
      getVendorCustomer.IncludePrenote_EFTSpecified = true; 
      getVendorCustomer.Vendor_Customer = "{our customer number}"; 

      payload.GetVendorCustomerIn = getVendorCustomer; 

      AdvMessage advMessage = new AdvMessage(); 
      advMessage.Header = header; 
      advMessage.Payload = payload; 

      GetVendorCustomer customer = new GetVendorCustomer(); 
      customer.AdvMessage = advMessage; 
      getVendorCustomerRequest customerReq = new getVendorCustomerRequest(); 
      customerReq.getVendorCustomer = customer; 

      //VendorServicesClient wcfClient = new VendorServicesClient(); 
      //var s = wcfClient.State; 
      //wcfClient.Open(); 

      var wcfClient = new WebChannelFactory<VendorServicesChannel>(
       new Uri("{the target uri}")); 
      //var s = wcfClient.State; 
      //wcfClient.Open(); 
      wcfClient.Endpoint.EndpointBehaviors.Add(new AuthenticationHeaderBehavior("txtUser", "txtPass", wso2token)); 

      //using (new OperationContextScope(wcfClient.InnerChannel)) 
      //{ 
      // WebProxy wproxy = new WebProxy(new Uri("our proxy server and port"), true); 
      // wproxy.BypassProxyOnLocal = true; 
      // wproxy.UseDefaultCredentials = true; 

      // WebRequest.DefaultWebProxy = wproxy; 

      // // Add a HTTP Header to an outgoing request  
      // HttpRequestMessageProperty requestMessage = new HttpRequestMessageProperty(); 
      // requestMessage.Headers["Authorization"] = " Bearer " + wso2token; 

      // OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestMessage; 

      // var result = wcfClient.getVendorCustomer(customer); 
      //} 

      var proxy = wcfClient.CreateChannel(); 
      using ((IDisposable)proxy) 
      using (OperationContextScope c = new OperationContextScope((IContextChannel)proxy)) 
      { 
       //WebProxy wproxy = new WebProxy(new Uri("our proxy server and port"), true); 
       //wproxy.BypassProxyOnLocal = true; 
       //wproxy.UseDefaultCredentials = true; 
       //WebRequest.DefaultWebProxy = wproxy; 
       //Add a HTTP Header to an outgoing request  
       //HttpRequestMessageProperty requestMessage = new HttpRequestMessageProperty(); 
       //requestMessage.Headers["Authorization"] = " Bearer " + wso2token; 

       //OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestMessage; 

       var result = proxy.getVendorCustomer(customerReq); 
      } 
     } 
    } 

    public class AuthenticationHeader : IClientMessageInspector 
    { 
     #region Implementation of IClientMessageInspector 

     string itsUser; 
     string itsPass; 
     string itsToken; 

     public AuthenticationHeader(string user, string pass, string token) 
     { 
      itsUser = user; 
      itsPass = pass; 
      itsToken = token; 
     } 

     public object BeforeSendRequest(ref Message request, 
      IClientChannel channel) 
     { 
      //HttpRequestMessageProperty hrmp = request.Properties["httpRequest"] as HttpRequestMessageProperty; 
      //string encoded = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(itsUser + ":" + itsPass)); 
      //hrmp.Headers.Add("Authorization", "Basic " + encoded); 
      //return request; 

      //HttpRequestMessageProperty hrmp = request.Properties["httpRequest"] as HttpRequestMessageProperty; 
      //hrmp.Headers.Add("Authorization", " Bearer " + itsToken); 

      //HttpRequestMessageProperty requestMessage = new HttpRequestMessageProperty(); 
      //requestMessage.Headers["Authorization"] = " Bearer " + itsToken; 

      //OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestMessage; 

      //return request; 

      WebProxy wproxy = new WebProxy(new Uri("our proxy server and port"), true); 
      wproxy.BypassProxyOnLocal = true; 
      wproxy.UseDefaultCredentials = true; 
      WebRequest.DefaultWebProxy = wproxy; 

      //// Add a HTTP Header to an outgoing request  
      HttpRequestMessageProperty hrmp = request.Properties["httpRequest"] as HttpRequestMessageProperty; 
      hrmp.Headers["Authorization"] = " Bearer " + itsToken; 

      return request; 
     } 

     public void AfterReceiveReply(ref Message reply, object correlationState) 
     { 
      //Console.WriteLine("Received the following reply: '{0}'", reply.ToString()); 
     } 
     #endregion 
    } 

    public class AuthenticationHeaderBehavior : IEndpointBehavior 
    { 
     #region Implementation of IEndpointBehavior 

     readonly string itsUser; 
     readonly string itsPass; 
     readonly string itsToken; 

     public AuthenticationHeaderBehavior(string user, string pass, string token) 
      : base() 
     { 
      itsUser = user; 
      itsPass = pass; 
      itsToken = token; 
     } 

     public void Validate(ServiceEndpoint endpoint) { } 

     public void AddBindingParameters(ServiceEndpoint endpoint, 
      BindingParameterCollection bindingParameters) { } 

     public void ApplyDispatchBehavior(ServiceEndpoint endpoint, 
      EndpointDispatcher endpointDispatcher) { } 

     public void ApplyClientBehavior(ServiceEndpoint endpoint, 
      ClientRuntime clientRuntime) 
     { 
      clientRuntime.MessageInspectors.Add(new AuthenticationHeader(itsUser, itsPass, itsToken)); 
     } 

     #endregion 
    } 
} 

回答

0

我認爲答案是,我忘了我的通道綁定