Использование IDispatchMessageInspector для получения удаленного адреса запроса

Я пытаюсь следить за этим сообщением в блоге: http://blogs.msdn.com/b/carlosfigueira/archive/2011/04/19/wcf-extensibility-message-inspectors.aspx

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

Вот интерфейс, который я реализую:

public interface IDispatchMessageInspector
{
    object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext);
    void BeforeSendReply(ref Message reply, object correlationState);
}

Я пытаюсь получить удаленный адрес в AfterReceiveRequest, Я проверил оба параметра request а также channel, Кроме того, кажется, что channel.RemoteAddress где это должно быть, но это свойство является нулевым по какой-то причине. request Параметр также нулевой, но я предполагаю, что это потому, что я делаю GET, а не POST.

Ниже приведена подпись метода, который я вызываю, чтобы проверить это.

[OperationContract, WebGet( UriTemplate = "{*path}", ResponseFormat = WebMessageFormat.Json)]
string[] GetList(string path);

3 ответа

Решение

Использование OperationContext.Current.IncomingMessageHeaders.From

ИЛИ ЖЕ

(OperationContext.Current. IncomingMessageProperties[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty).Address

ИЛИ ЖЕ

HttpContext.Current.Request.UserHostAddress (ВНИМАНИЕ, этот требует настройки <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>)

Используйте это из IDispatchMessageInspector реализация:

var remoteEndpoint = request.Properties[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
var ipAddress = remoteEndpoint.Address;

Информация будет в заголовках запросов, найденных с помощью:

WebHeaderCollection headers = WebOperationContext.Current.IncomingRequest.Headers;
Другие вопросы по тегам