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

4

1 回答 1

0

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

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

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

于 2014-01-04T05:55:20.323 回答