我正在尝试将.net SDK移植到.net PCL库。我正在构建一个Json绑定,因为PCL不支持WebHttpBinding
。我已经完成了大部分工作,但我仍然试图根据每个操作合同找到我可以修改ServiceEndPoint
的位置。
例如......
/SomeService.svc
说有两种方法
SomeMethod1
SomeMethod2
我需要在每个端点的末尾为每种特定方法添加一些额外的信息。
/SomeService.svc/SomeMethod1 for SomeMethod1
和
/SomeService.svc/SomeMethod2 for SomeMethod2
WebHttpBinding
透明地完成所有这些,所以我试图重现同样的行为。
我有一种感觉,也许我需要用行为来实现,实现IEndpointBehavior
但是我似乎无法找到如何为服务中可用的每个操作修改ServiceEndpoint
。 ApplyClientBehavior
似乎是一次运行操作。
可移植类库没有可以使用的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对象在一个不同的位置。想法?