在运行时更改服务引用端点,有时使用错误的端点

时间:2013-09-19 16:29:08

标签: c# wcf web-services

我有一个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!)。通过一些工作,我可以重构真正的代码以便这样工作,但我仍然非常感谢解释。学习很重要。

1 个答案:

答案 0 :(得分:0)

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

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

默认情况下,ClientBase`1的CacheSetting使用CacheSetting.Default,这意味着它尝试缓存通道工厂,所以有时你似乎碰巧从2个不同的客户端修改了缓存工厂的端点