У меня есть веб-сервис, написанный на С#, и я пытаюсь запустить его на Mono (Mono JIT-компилятор версии 2.10.8.1 (Debian 2.10.8.1-1ubuntu2.2))
В веб-службе есть вспомогательная функция для определения IP-адреса вызывающего абонента:
public static System.Net.IPAddress GetCallerIP()
{
System.ServiceModel.OperationContext context = System.ServiceModel.OperationContext.Current;
System.ServiceModel.Channels.MessageProperties prop = context.IncomingMessageProperties;
System.ServiceModel.Channels.RemoteEndpointMessageProperty callerEndpoint =
prop[System.ServiceModel.Channels.RemoteEndpointMessageProperty.Name] as System.ServiceModel.Channels.RemoteEndpointMessageProperty;
System.Net.IPAddress ip= System.Net.IPAddress.Parse(callerEndpoint.Address);
return ip;
}
В Windows есть 6 свойств в prop: Via, httpRequest, System.ServiceModel.Channels.RemoteEndpointMessageProperty, UriTemplateMatchResults, UriMatched, HttpOperationName
На Ubuntu я вижу только 3 свойства: Via, httpRequest, Urimatched
Поэтому моя вспомогательная функция не может определить IP-адрес вызывающего абонента при работе на Ubuntu. Что не так?
Дополнительная информация
Mono поддерживает RemoteEndpointMessageProperty с 2.10.3, поэтому я уверен, что моя версия Mono поддерживает его.
Что касается RemoteEndpointMessageProperty, MSDN говорит следующее в разделе "Примечания":
Свойство добавляется к каждому входящему сообщению в службу Windows Communication Foundation (WCF) через оба транспорта HTTP и TCP.
Свойство отсутствует в сообщениях, полученных либо по именованным каналам, либо по транспорту MSMQ.
Интересно, относится ли это к моей проблеме? Но как я могу проверить?
mono является открытым исходным кодом, поэтому вы всегда можете просто просмотреть код и историю фиксации. Кроме того, вы можете даже отлаживать само время выполнения, например, в monodevelop
"Только код проекта Debug, не monodevelop
в код рамки".
С быстрого взгляда, для сообщений HTTP POST соответствующее свойство устанавливается с момента фиксации fd8ae35d. Хотя это предшествует выпуску 2.10.8.1
, к сожалению, эта версия появилась из другой ветки и, следовательно, не включает это изменение. Первая версия содержит 2.11.0
.
Серия 2.x очень устарела, но в любом случае обновление - хорошая идея.