Как отправить и получить информацию о пользовательских заголовках для REST WCF Service - PullRequest
0 голосов
/ 08 марта 2019

Я пытаюсь настроить инфраструктуру в своем решении, чтобы отправлять и получать пользовательский заголовок для службы REST WCF.По сути, нам это нужно для отправки идентификатора пользователя, пароля, значения токена от клиента к сервису, и если указанные значения действительны, то операция продолжит выполняться, в противном случае будет выдано исключение.

У нас уже есть несколько классов, унаследованных от таких интерфейсов, как IDispatchMessageInspector, IClientMessageInspector, IEndPointBehaviour, MessageHeader и т. Д. Это нормально работает для WCF с запросом на мыло.Я пытался использовать эти классы для моей новой службы REST WCF, но не работал, поскольку производный класс MessageHeader поддерживает только Soap.

Я также пытался использовать WebOperationContext, но безуспешно: (

Пожалуйста, предоставьте решение вместе с примером проекта для решения этой проблемы.

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 11 марта 2019

Если вы хотите добавить заголовок http в wcf rest service, вы должны использовать HttpRequestMessageProperty, у него есть свойство Headers, вы можете установить http Header через его свойство Headers

 using (OperationContextScope scope = new OperationContextScope(client.InnerChannel))
            {
                HttpRequestMessageProperty property;
                     // if OutgoingMessageProperties already has HttpRequestMessageProperty, use the existing one , or  initialize a new one and 
                 set   OutgoingMessageProperties's HttpRequestMessageProperty.Name key's value to the initialized  HttpRequestMessageProperty so that the HttpRequestMessageProperty  will work 
                if (OperationContext.Current.OutgoingMessageProperties.ContainsKey(HttpRequestMessageProperty.Name)){
                    property = OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] as HttpRequestMessageProperty;
                }
                else
                {
                    property = new HttpRequestMessageProperty();
                    OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = property;
                }
          // add headers to  HttpRequestMessageProperty, it will become the http header of the reuqest
                property.Headers.Add(System.Net.HttpRequestHeader.Authorization, "myAuthorization");
                string re = client.HelloWorld();
            }

О получении заголовка, простоиспользовать WebOperationContext.Current.Headers.

WebOperationContext.Current.IncomingRequest.Headers["MyCustomHttpHeader"]

Пожалуйста, обратитесь к http://kenneththorman.blogspot.com/2011/02/wcf-rest-client-using-custom-http.html

0 голосов
/ 08 марта 2019

Кажется, в вашем случае было бы проще объединить конвейер ASPNET

если добавить в службу WCF следующее, чтобы она могла подключиться к конвейеру ASPNET

[AspNetCompatibilityRequirements (RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] * ​​1006 *

Тогда вы можете просто использовать объект HttpContext и просто получить заголовки, как в обычном приложении aspnet, например,

System.Web.HttpContext.Current.Request.Headers["CustomHeader"]
...