#rest #wcf #c#-4.0
#rest #wcf #c #-4.0
Вопрос:
Я пытаюсь настроить инфраструктуру в своем решении для отправки и извлечения пользовательского заголовка для службы REST WCF. В принципе, нам это нужно для отправки идентификатора пользователя, пароля, значения токена от клиента к службе, и если предоставленные значения действительны, то операция продолжит выполняться, в противном случае возникнет исключение.
У нас уже есть несколько классов, унаследованных от интерфейсов, таких как IDispatchMessageInspector, IClientMessageInspector, IEndPointBehaviour, MessageHeader и т.д., Это отлично работает для WCF с запросом soap. Я пытался использовать эти классы для моей новой службы REST WCF, но не работал, поскольку производный класс MessageHeader поддерживает только Soap.
Я также пытался использовать WebOperationContext, но безуспешно: (
Пожалуйста, предоставьте решение вместе с примером проекта для решения этой проблемы.
Большое вам спасибо!
Ответ №1:
Кажется, в вашем случае было бы проще взаимодействовать с конвейером ASPNET
если вы добавите следующее в свою службу WCF, чтобы разрешить ее подключение к конвейеру ASPNET
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Разрешено)]
Тогда вы можете просто использовать объект HttpContext и просто получать заголовки, как из обычного приложения aspnet, например
System.Web.HttpContext.Current.Request.Headers["CustomHeader"]
Ответ №2:
Если вы хотите добавить http-заголовок в службу wcf rest, вам следует использовать HttpRequestMessageProperty , у него есть свойство Headers , вы можете установить http-заголовок через его свойство 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.Заголовки.
WebOperationContext.Current.IncomingRequest.Headers["MyCustomHttpHeader"]
Пожалуйста, обратитесь к http://kenneththorman.blogspot.com/2011/02/wcf-rest-client-using-custom-http.html