从代理客户端将参数传递给 WCF 服务中心

Posted

技术标签:

【中文标题】从代理客户端将参数传递给 WCF 服务中心【英文标题】:Passing parameter to WCF Service Ctor from Proxy Client 【发布时间】:2014-02-20 05:14:56 【问题描述】:

这可能是一个基本问题,因为我是 WCF 新手。我什至不知道这是否支持。

我有一个名为 MyCustomService 的 WCF 服务。我在我的客户端解决方案中添加了这个服务引用,现在我可以通过调用来创建一个代理对象:

MyCustomServiceClient myClient = new MyCustomServiceClient();
myClient.GetData();
myClient.GetData();

如何布局我的服务,以便在创建代理实例期间传递参数,即

MyCustomServiceClient myClient = new MyCustomServiceClient("SomeString");

我注意到我所做的每个方法调用都会创建一个新的 MyCustomService 实例(即我可以在 MyCustomService 的 Tor 上获得断点)。所以,我希望我在创建代理对象(即 SomeString)时传递的值存在于我所做的所有调用中,直到 myClient 的生命周期

有什么想法吗?

【问题讨论】:

你想在构造函数中设置什么?您尝试为每个客户设置的值是否唯一? 是的。我传递的字符串对于每个客户来说都是独一无二的。 您最好的选择可能是使用InstanceContextMode.PerSession,正如米兰在下面的回答中所写的那样。您将无法在构造函数中设置值,因此您需要在客户端进行的第一次调用时将其传递(通过特定调用设置值或检查是否已在每次调用时设置) .如果您可以提供更多设计要求来说明您想要/需要这样做的原因,我们可能会给出更好的答案。 【参考方案1】:

Visual Studio(或 svcutil.exe)的代理生成功能创建一个具有五个不同构造函数签名的代理类。您所询问的构造函数采用单个字符串,这是一个非常有用的构造函数,因为它允许您从 app.config 或 Web.config 文件中引用不同的客户端配置。

以这个极其简单的假设配置文件为例:

<configuration>
  <system.serviceModel>
    <client>
      <endpoint name="serverABinding" />
      <endpoint name="serverBBinding" />
    </client>
  </system.serviceModel>
</configuration>

然后您可以控制用于代理的绑定:

string endpointName = useB ? "serverBBinding" : "serverABinding";

var myClient = new MyCustomServiceClient(endpointName);

当然,我上面展示的端点绑定太简单了,实际上没有用,但希望你能明白。

您的动机并不十分清楚,但听起来您想控制应用程序所有代理实例的代理行为。如果这是您想要的,那么不要使用构造函数:使用 app.config 或 Web.config 文件中的端点配置来控制代理连接。 Visual Studio 生成的默认终结点配置使用与代理客户端的默认名称匹配的终结点名称。更改此端点定义,您将更改服务客户端的行为。

由于您是 WCF 新手,我给您的建议是:了解所有有关配置文件的知识。一旦您了解了 WCF 配置文件,您就了解了 WCF。

【讨论】:

【参考方案2】:

你的 WCF 服务中不能有带参数的构造函数,即使你尝试创建这样的服务也会出现以下错误。

提供的服务类型无法作为服务加载,因为它 没有默认(无参数)构造函数。修复 问题,给类型添加一个默认构造函数,或者传递一个实例 主机的类型。

现在,如果您希望数据为客户端保留,您可以将 ServiceInstanceContextMode 设置为服务类的属性,如下所示

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] 
 public class Service : IService

【讨论】:

这并不完全正确。请注意您发布的最后一部分:or pass an instance of the type to the host. 您可以使用带参数的构造函数创建服务实例,然后将该实例传递给服务主机。虽然这不能解决 OP 的问题。 You can not have a constructor with parameter in your WCF service 是个谎言,见***.com/a/2455039/184746

以上是关于从代理客户端将参数传递给 WCF 服务中心的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 中将参数传递给 websocket

将参数传递给 json webservice

无法以 GET 类型的方法将字典作为参数传递给 WCF REST 服务

使用 Ninject 2 将参数传递给 WCF ServiceHost 类型

java spring boot将字符串数组作为json中的参数传递给ajax调用

将 json 参数传递给 WCF 函数给出错误“服务器在处理请求时遇到错误。有关更多详细信息,请参阅服务器日志”