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

Ego*_*gor 6 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

 }
Run Code Online (Sandbox Code Playgroud)

当我有两个请求与不同的URL非常接近时,这有时不起作用.第二个请求最终会转到与第一个请求相同的端点.我知道一旦频道打开我就无法改变端点,但我认为客户端只会被使用一次然后处理掉.是否有一些优化在同一个代理被重用于多个请求的地方?对这样的问题有什么好处?

编辑:更多细节:

该片段是一个方法的一部分(让我们称之为foo()),它暴露给我的RESTful服务的消费者.它不是静态的.端点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!";
     }
}
Run Code Online (Sandbox Code Playgroud)

我没有为并发控制设置任何明确的内容.我理解它背后的理论,但缺乏技术经验,所以任何手握都会非常感激.

也!有一个半有效的理由来更改端点地址,而不是在代理构造函数中指定它.但是,出于测试目的,我只是尝试在构造函数中指定并且它看起来工作正常(感谢JMeter!).通过一些工作,我可以重构真正的代码以便这样工作,但我仍然非常感谢解释.学习很重要.

Lif*_*ess 0

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

public ServiceEndpoint Endpoint
{
    get
    {
        TryDisableSharing();
        return GetChannelFactory().Endpoint;
    }
}
Run Code Online (Sandbox Code Playgroud)

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