在运行时更改服务引用终结点,有时会使用错误的终结点。

6

我有一个WCF服务,它又引用了另一个SOAP终结点的服务引用。该终结点在另一个地址上具有相同的元数据但不同的数据。当请求到达我的服务时,它指定了我要从这两个相同的终结点中哪一个获取数据。所以,我有如下代码:

 using (var client = new ServiceClient())
 {         
     client.Endpoint.Address = new System.ServiceModel.EndpointAddress(url);                

     //do some work, pull some data, bake some muffins

 }

有时当我有两个请求非常接近且具有不同的url时,这种方法不起作用。第二个请求最终与第一个请求相同的端点连接。我知道一旦通道打开就无法更改端点,但我认为客户端只会被使用一次,然后被处理。是否存在某些优化,使得同一代理用于多个请求?解决此类问题的好方法是什么?
编辑:更多详细信息: 这个片段是一个暴露给我的RESTful服务的消费者的方法(我们称之为foo())。它不是静态的。端点url是作为URI的一部分提供的本地字符串。
[OperationContract]
[WebInvoke(Method = "GET",
           ResponseFormat = WebMessageFormat.Json,
           UriTemplate = "getStuff?url={url}")]
 string foo(string url);

public string foo(string url)
{
     using (var client = new ServiceClient())
     {         
         client.Endpoint.Address = new System.ServiceModel.EndpointAddress(url);                

         //do some work, pull some data, bake some muffins
         return "SO rocks!";
     }
}

我还没有为并发控制设置任何明确的内容。我理解它背后的理论,但缺乏技术经验,因此如果需要帮助,请手把手地指导我。

另外!更改终端地址而不是在代理构造函数中指定它有一个半合理的原因。然而,出于测试目的,我尝试在构造函数中指定它,似乎完美地运行了(感谢JMeter!)。稍微修改一下真实代码,我也可以按这种方式运行,但仍然非常感谢您的解释。学习很重要。


你没有提供太多细节... 这段代码片段是静态方法的一部分吗?url字段如何进入并在范围内维护?服务的InstanceContext和ConcurrencyControl设置是什么?等等。 另外,请查看此链接 - http://msdn.microsoft.com/en-us/library/aa355056.aspx - 并确保您不依赖于c# using语句,而是手动关闭/中止客户端。 - Dienekes
谢谢!我更新了问题。我也阅读了文章,尽管它似乎不适用于我的情况。没有抛出任何异常,我的所有代码都可以运行。我为了彻底测试而尝试手动关闭,但没有任何影响。 - Egor
我尝试了你提供的代码,并且在连续调用时它能够正常运行。传递给REST服务的endpt1和endpt2的顺序是正确的,它们被正确调用而没有重叠。 - Dienekes
好的,谢谢您的检查。也许我过于简化了,并认为问题在于WCF的工作方式,而实际上是在我的实现中存在一些古怪的细节。我将从最基本的开始,尝试构建到当前的解决方案,并在此过程中进行测试,以查看它在哪里以及为什么会出现故障。 - Egor
你尝试过使用自定义的 ProxyBase 吗? - Kiquenet
1个回答

0

如果您查看ClientBase`1源代码,您会注意到Endpoint实际上是从底层的ChannelFactory中检索出来的:

public ServiceEndpoint Endpoint
{
    get
    {
        TryDisableSharing();
        return GetChannelFactory().Endpoint;
    }
}

默认情况下,ClientBase`1的CacheSetting使用CacheSetting.Default,这意味着它尝试缓存通道工厂,因此有时您可能会发现来自2个不同客户端的缓存工厂的终结点被修改了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接