WCF根据操作方法名称修改端点地址

时间:2014-07-06 20:10:27

标签: .net json wcf windows-runtime portable-class-library

我正在尝试将.net SDK移植到.net PCL库。我正在构建一个Json绑定,因为PCL不支持WebHttpBinding。我已经完成了大部分工作,但我仍然试图根据每个操作合同找到我可以修改ServiceEndPoint的位置。

例如......

/SomeService.svc

说有两种方法

SomeMethod1
SomeMethod2

我需要在每个端点的末尾为每种特定方法添加一些额外的信息。

/SomeService.svc/SomeMethod1 for SomeMethod1

/SomeService.svc/SomeMethod2 for SomeMethod2

WebHttpBinding透明地完成所有这些,所以我试图重现同样的行为。

我有一种感觉,也许我需要用行为来实现,实现IEndpointBehavior但是我似乎无法找到如何为服务中可用的每个操作修改ServiceEndpointApplyClientBehavior似乎是一次运行操作。

可移植类库没有可以使用的WebHttp行为

PCL目标:.net 4.5和Windows 8.1(以及后来的Xamarin)

如果我手动设置endpoint.Address,我的服务通信就好了,但只针对一种方法。

我知道这是可能的,因为WebHttpBinding会这样做。

Referencesource.microsoft.com很棒,但遵循它是非常具有挑战性的,并且PCL不支持.net BCL具有的一半对象。我们被迫自己建立。

非常感谢您的想法。

更新:我发现如果我在自定义行为中打开ManualAddressing并将message.Headers.To属性设置为端点+路径,我就可以完成此操作。我是在IClientMessageInspector中做到的 - 这是进行此修改的正确位置吗?

public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel)
    {
        var action = CustomHelper.GetMethodName(request.ToString());

        request.Headers.To = new Uri(string.Format("{0}/{1}", channel.Via, action));

        return null;
    }

是否有其他方式可以访问正在执行的实际ClientOperation?我需要附加方法名称。我开始构建自己的Message,在那里我可以将此操作附加到其上的属性。这可能是一个更好的地方。

我有一种感觉,我可以调整这个Message.Headers.To对象在一个不同的位置。想法?

0 个答案:

没有答案