WCF Добавление пользовательских заголовков и сессий - PullRequest
0 голосов
/ 31 августа 2011

У меня есть веб-страница, которая использует сервис WCF.Несколько пользователей могут использовать веб-страницу в любое время и, следовательно, делать запросы к службе WCF, которая находится на удаленной машине.

Каждый пользователь на веб-странице получает уникальный идентификатор, я хочу добавить этот уникальный идентификаторк заголовку запроса каждого запроса, сделанного этим пользователем.

До сих пор я создал следующий код, который правильно добавляет заголовок к сообщению WCF.

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)
    {

    }
}

Однако я не застрялпотому что я не могу получить идентификатор для сохранения между запросами.Здесь вы можете видеть, что в данный момент я генерирую идентификатор для каждого запроса, однако я не могу сохранить его в сеансе страницы, на которой находится пользователь, поскольку HttpContext.Current имеет значение null.Есть ли другой способ сохранить это?Есть ли другой способ передачи HttpContext пользователя на моей веб-странице?

Ответы [ 2 ]

0 голосов
/ 01 сентября 2011

После долгих взломов я нашел решение, оно не очень хорошее, но оно работает.

На странице ASP.NET перед созданием экземпляра службы WCF я создаю заголовок адреса и конечную точку:

 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);

Затем я создаю экземпляр службы, передаваемой в конечную точку:

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

           }

При этом данные поступают в службу WCF, затем в описанном выше HeaderIdPusher: 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 голосов
/ 31 августа 2011

Проблема обсуждается здесь: http://social.msdn.microsoft.com/forums/en-US/wcf/thread/27896125-b61e-42bd-a1b0-e6da5c23e6fc

По существу WCF не имеет сессий, так как вы можете передать все, что вы хотели в качестве параметра (в данном случае, ваш уникальный идентификатор) и обрабатывать его любым способом.вы хотели в вашей реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...