2011-08-22 3 views
3

"string"변수에 사용자 정의 헤더가 저장되어 있습니다. WCF 클라이언트의 보내는 SOAP 요청 헤더를 "string"유형 변수의 헤더로 바꿔야합니다. 연구 결과에 따르면 MessageHeaders.WriteHeaderContents을 구현하면 작동하지만이 방법은 XmlDictionaryWriter 또는 XmlWriter 유형 만 입력 할 수 있음을 알 수 있습니다. 문자열 입력이 있습니다. C#으로 어떻게 코딩합니까?MessageHeaders.WriteHeaderContents를 구현하는 예제가 필요합니다.

답변

4

메시지 헤더는 SOAP 개념이고 SOAP 요청은 XML 문서이므로 실제로 XML이 필요합니다. 그러나 시나리오에서는 실제로 MessageHeaders을 재정의 할 필요가 없으므로 아래 예제와 같이 관리자를 사용하여 해당 시점의 헤더를 간단하게 바꿀 수 있습니다 (XML 변환은 MessageHeader 클래스로 수행됩니다).

public class StackOverflow_7141998 
{ 
    [MessageContract] 
    public class MyMC 
    { 
     [MessageHeader(Name = "MyHeader", Namespace = "http://my.namespace.com")] 
     public string HeaderValue { get; set; } 
     [MessageBodyMember(Name = "MyBody", Namespace = "http://my.namespace.com")] 
     public string BodyValue { get; set; } 
    } 
    [ServiceContract] 
    public interface ITest 
    { 
     [OperationContract] 
     void Process(MyMC mc); 
    } 
    public class Service : ITest 
    { 
     public void Process(MyMC mc) 
     { 
      Console.WriteLine("Header value: {0}", mc.HeaderValue); 
     } 
    } 
    public class MyInspector : IEndpointBehavior, IClientMessageInspector 
    { 
     public string NewHeaderValue { get; set; } 

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

     public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime) 
     { 
      clientRuntime.MessageInspectors.Add(this); 
     } 

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

     public void Validate(ServiceEndpoint endpoint) 
     { 
     } 

     public void AfterReceiveReply(ref Message reply, object correlationState) 
     { 
     } 

     public object BeforeSendRequest(ref Message request, IClientChannel channel) 
     { 
      int originalIndex = request.Headers.FindHeader("MyHeader", "http://my.namespace.com"); 
      if (originalIndex >= 0) 
      { 
       request.Headers.Insert(originalIndex, MessageHeader.CreateHeader("MyHeader", "http://my.namespace.com", this.NewHeaderValue)); 
       request.Headers.RemoveAt(originalIndex + 1); 
      } 

      return null; 
     } 
    } 
    public static void Test() 
    { 
     string baseAddress = "http://" + Environment.MachineName + ":8000/Service"; 
     ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress)); 
     ServiceEndpoint endpoint = host.AddServiceEndpoint(typeof(ITest), new WSHttpBinding(), ""); 
     host.Open(); 
     Console.WriteLine("Host opened"); 

     ChannelFactory<ITest> factory = new ChannelFactory<ITest>(new WSHttpBinding(), new EndpointAddress(baseAddress)); 
     MyInspector inspector = new MyInspector { NewHeaderValue = "Modified header value" }; 
     factory.Endpoint.Behaviors.Add(inspector); 
     ITest proxy = factory.CreateChannel(); 

     proxy.Process(new MyMC { HeaderValue = "Original header value", BodyValue = "The body" }); 

     ((IClientChannel)proxy).Close(); 
     factory.Close(); 

     Console.Write("Press ENTER to close the host"); 
     Console.ReadLine(); 
     host.Close(); 
    } 
} 
관련 문제