Как установить http куки (заголовки) в HTTP запросе - PullRequest
2 голосов
/ 10 февраля 2011

Я пытаюсь настроить службу WCF, размещенную в IIS, в режиме совместимости ASP.Net, который защищен с помощью проверки подлинности с помощью форм и доступен через элемент управления .Net в IE. (см. Безопасная служба WCF, размещенная в IIS, для доступа через пользовательский элемент управления, размещенный в IE ).

Пользовательский элемент управления в IE необходим, поскольку он использует специальный сторонний элемент управления, для которого не существует ничего похожего в Silverlight или AJAX.

Поэтому мне нужно, чтобы UserControl установил куки аутентификации и идентификатора сеанса в заголовках http-запроса, прежде чем он получит доступ к службе WCF. Мой подход заключается в создании инспектора сообщений, который делает это.

Итак, я определил инспектора сообщений:

public class CookieInspector : IClientMessageInspector {

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

    public object BeforeSendRequest(
            ref Message request, 
            IClientChannel channel) {

        HttpRequestMessageProperty messageProperty;

        if (request.Properties.ContainsKey(HttpRequestMessageProperty.Name)) {
            messageProperty = (HttpRequestMessageProperty) request.Properties[
                HttpRequestMessageProperty.Name
            ];
        }
        else {
            messageProperty = new HttpRequestMessageProperty();
            request.Properties.Add(
                HttpRequestMessageProperty.Name, 
                messageProperty
            );
        }

        // Set test headers for now...
        messageProperty.Headers.Add(HttpRequestHeader.Cookie, "Bob=Great");
        messageProperty.Headers.Add("x-chris", "Beard");

        return null;
    }
}

и поведение конечной точки:

public class CookieBehavior : IEndpointBehavior {
    public void AddBindingParameters(
            ServiceEndpoint endpoint, 
            BindingParameterCollection bindingParameters) {
    }

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

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

    public void Validate(ServiceEndpoint endpoint) {
    }
}

и я настраиваю и создаю свой канал и клиент WCF в коде:

var ea = new EndpointAddress("http://.../MyService.svc");

// EDIT: Http cookies can't be set with WSHttpBinding :-(
// var binding = WSHttpBinding();
var binding = new BasicHttpBinding();


// Disable automatically managed cookies (which enables user cookies)
binding.AllowCookies = false;


binding.MaxReceivedMessageSize = 5000000;
binding.ReaderQuotas.MaxStringContentLength = 5000000;
var cf = new ChannelFactory<ITranslationServices>(binding, ea);
cf.Endpoint.Behaviors.Add(new CookieBehavior());    

ITranslationServices service = cf.CreateChannel();

Однако, когда я смотрю на мой запрос с помощью Fiddler, заголовок http и cookie не заданы, и я понятия не имею, почему. Я читал различные статьи в сети, Stackoverflow и т. Д., Которые в основном говорят, что он должен работать, но это не так. Либо я упускаю что-то очевидное, либо есть ошибка в WCF или что-то еще?

Ответы [ 2 ]

3 голосов
/ 11 февраля 2011

Ну, я понял, что если я использую BasicHttpBinding вместо WSHttpBinding, он работает.Не знаю почему, хотя ...

0 голосов
/ 02 февраля 2012

WSHttpBinding может состоять из нескольких физических сообщений на одно логическое сообщение. Поэтому, когда выполняются последовательные физические вызовы, они могут нести cookie соответствующим образом

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