Mono / WCF:无法在Ubuntu上确定调用者IP

本文关键字:调用者 IP Ubuntu WCF Mono | 更新日期: 2023-09-27 18:05:41

我有一个用c#编写的web服务,我正试图在Mono (Mono JIT编译器版本2.10.8.1 (Debian 2.10.8.1-1ubuntu2.2))上运行它

在web服务中有一个辅助函数来确定调用者的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上,prop中有6个属性:Via, httpRequest, System.ServiceModel.Channels.RemoteEndpointMessageProperty, UriTemplateMatchResults, UriMatched, HttpOperationName

在Ubuntu上,我只看到3个属性:Via, httpRequest, Urimatched

因此,在Ubuntu上运行时,我的helper函数无法确定调用者的IP地址。怎么了?

Mono从2.10.3开始支持RemoteEndpointMessageProperty,所以我很确定我的Mono版本支持它。

关于RemoteEndpointMessageProperty, MSDN在备注部分中说:

该属性通过HTTP和TCP传输被添加到Windows通信基础(WCF)服务的每个传入消息中。

该属性不存在于通过命名管道或MSMQ传输接收的消息中。

我想知道这是否与我的问题有关?但是我如何验证呢?

Mono / WCF:无法在Ubuntu上确定调用者IP

mono是开源的,因此您总是可以查看代码和提交历史。此外,您甚至可以调试运行时本身,例如在monodevelop中取消勾选"调试项目代码;不要进入框架代码选项。

快速浏览一下,对于HTTP POST消息,相关属性在commit fd8ae35d之后被设置。虽然这早于2.10.8.1的发布,但不幸的是,该版本来自不同的分支,因此没有包含此更改。第一个包含它的版本是2.11.0

2。X系列现在已经很老了,升级是个好主意。