2011-08-31 5 views
0

WCF 서비스를 사용하는 웹 페이지가 있습니다. 여러 사용자가 언제든지 웹 페이지를 사용하여 원격 컴퓨터에있는 WCF 서비스에 요청할 수 있습니다.WCF 사용자 지정 헤더 및 세션 추가

웹 페이지의 각 사용자는 고유 한 ID를 얻습니다.이 고유 ID를 해당 사용자가 요청한 각 요청의 요청 헤더에 추가하려고합니다.

지금까지 WCF 메시지에 헤더를 올바르게 추가하는 다음 코드를 작성했습니다. 내가 요청 사이에 지속 할 수있는 ID를 얻을 수 없기 때문에

public class HeaderIdPusher : IClientMessageInspector 
{ 

    private static readonly string _balancerKey = "balancerId"; 
    public object BeforeSendRequest(ref Message request, IClientChannel channel) 
    { 
     Guid userId = Guid.NewGuid(); 


     HttpRequestMessageProperty httpRequestMessage; 
     object httpRequestMessageObject; 
     if (request.Properties.TryGetValue(HttpRequestMessageProperty.Name, out httpRequestMessageObject)) 
     { 
      httpRequestMessage = httpRequestMessageObject as HttpRequestMessageProperty; 
      if (string.IsNullOrEmpty(httpRequestMessage.Headers[_balancerKey])) 
      { 
       httpRequestMessage.Headers[_balancerKey] = userId.ToString(); 
      } 
     } 
     else 
     { 
      httpRequestMessage = new HttpRequestMessageProperty(); 
      httpRequestMessage.Headers.Add(_balancerKey, userId.ToString()); 
      request.Properties.Add(HttpRequestMessageProperty.Name, httpRequestMessage); 
     } 
     return null; 



    } 

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

    } 
} 

그러나 나는 더 붙어 오전 없습니다. 현재 요청마다 ID를 생성하고 있지만 HttpContext.Current가 null이므로 사용자가있는 페이지의 세션에 저장할 수 없다는 것을 알 수 있습니다. 이것을 저장하는 또 다른 방법이 있습니까? 내 웹 페이지에서 사용자의 HttpContext를 전달하는 또 다른 방법이 있습니까?

답변

0

많은 해킹을 한 후에 해결책을 찾았지만 훌륭하지는 않습니다.

  using (WcfService service = new WcfService(_configName,endpoint)) 
      { 

      } 
: 나는 엔드 포인트에 전달 서비스의 인스턴스를 생성 그런

AddressHeader header = AddressHeader.CreateAddressHeader("MyKey", "http://www.w3.org/2005/08/addressing", "MyValue"); 
EndpointAddress endpoint = new EndpointAddress(new Uri("http://www.myservice.com/service"), header); 

: 나는 WCF 서비스 인스턴스를 만들기 전에 ASP.NET 페이지에서

나는 주소 헤더와 엔드 포인트를 작성

이 다음 HeaderIdPusher에서 WCF 서비스로 데이터를 가져옵니다 내가 헤더 값을 꺼내 위에 IClientMessageInspector는 설명 :

public class HeaderIdPusher : IClientMessageInspector 
{ 
    public object BeforeSendRequest(ref Message request, IClientChannel channel) 
    { 
     string id = "Not found"; 

     if(channel.RemoteAddress.Headers.Any(x=>x.Name == "MyKey")) 
     { 
      id = channel.RemoteAddress.Headers.First(x => x.Name == "MyKey").GetValue<string>(); 
     } 

이 솔루션은 이상적이지 않으며 추가 데이터를 SOAP 메시지에 넣지 만 ASP.NET 페이지에서 WCF 프로세스로 데이터를 공유하는 유일한 방법입니다.

0

문제는 여기에 설명되어 있습니다 : 당신이 (이 경우, 사용자의 고유 ID)에 매개 변수로 원 아무것도 통과하고 그것에게 당신이 원하는 어떤 방식으로 처리 할 수로 http://social.msdn.microsoft.com/forums/en-US/wcf/thread/27896125-b61e-42bd-a1b0-e6da5c23e6fc

는 기본적으로 WCF는 세션이 없습니다 귀하의 구현에.

+0

ASP.NET 페이지의 데이터를 IClientMessageInspector로 전달할 수 있습니까? –

+0

WCF 서비스를 호출하는 방법에 대한 자세한 정보를 제공 할 수 있습니까? 그것은 클라이언트에서 또는 asp.net 서버를 통해 직접 있습니까? – Kaido

관련 문제