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

Posted

技术标签:

【中文标题】在运行时更改服务引用端点,有时会使用错误的端点【英文标题】:Changing service reference endpoint at runtime, sometimes the wrong endpoint is used 【发布时间】:2013-09-24 20:46:21 【问题描述】:

我有一个 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 非常接近时,这有时不起作用。第二个请求最终会发送到与第一个请求相同的端点。我知道一旦通道打开,我就无法更改端点,但我认为客户端只会被使用一次然后被处理掉。在将同一代理重新用于多个请求的情况下,是否正在进行一些优化?解决此类问题的好方法是什么?

编辑:更多细节:

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

【问题讨论】:

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

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

public ServiceEndpoint Endpoint

    get
    
        TryDisableSharing();
        return GetChannelFactory().Endpoint;
    

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

【讨论】:

以上是关于在运行时更改服务引用端点,有时会使用错误的端点的主要内容,如果未能解决你的问题,请参考以下文章

WCF 在运行时更改端点地址

WCF 服务错误没有在 HTTPS 上侦听的端点

WCF Web 服务错误:“服务端点绑定不使用 HTTP 协议”?

Node.js 服务器进程已在运行,无法调用端点

处理 boost 端点监听/运行错误

使用 php sdk 动态更改 Paypal Express 端点