C# 为WCF中的每个操作合同添加参数

C# 为WCF中的每个操作合同添加参数,c#,wcf,C#,Wcf,我需要更新现有的webservice,并为每个操作契约添加2个参数。 有没有办法通过重载类或从接口继承来自动添加它们 为了清楚我想要什么,这里有一个例子: 我现在有 [OperationContract] MyObject MyMethod(int parameter); 我现在需要 [OperationContract] MyObject MyMethod(string otherParameter, int parameter); 无需重写每个操作。调用方是否绝对“需要”此参数 如果没有

我需要更新现有的webservice,并为每个操作契约添加2个参数。 有没有办法通过重载类或从接口继承来自动添加它们

为了清楚我想要什么,这里有一个例子: 我现在有

[OperationContract]
MyObject MyMethod(int parameter);
我现在需要

[OperationContract]
MyObject MyMethod(string otherParameter, int parameter);

无需重写每个操作。

调用方是否绝对“需要”此参数

如果没有,您可以使用IOC容器在实例化WCF服务时通过构造函数将其传递给每个WCF服务

要在Ninject中执行此操作,您需要注册以下

Bind<ISomeService>().To<MyWcfService>()
    .WithConstructorArgument("otherParameter", theParameterValue);
Bind().To())
.带有构造函数参数(“其他参数”,即参数值);
上面的示例假设每次调用引入的参数都不会更改

如果每次调用时它都发生了变化,您可以向它传递一个方法而不是变量,或者使用lambda

Bind<ISomeService>().To<MyWcfService>()
    .WithConstructorArgument("otherParameter", () => { /* TODO calculate value */ });
Bind().To())
.WithConstructorArgument(“其他参数”,()=>{/*TODO计算值*/});
如果您不熟悉IOC容器和依赖项注入,您可以


我推荐使用它,因为它的API很简单。

不,没有办法通过继承向方法添加参数。此外,WCF方法,所以添加具有相同名称但具有额外参数的方法也不是一个选项

最简单的方法是手动更新接口(服务契约)及其实现(实际服务本身)

然而,您可以在这方面非常聪明(虽然这可能不是一个好主意),但是WCF有一些可扩展性点,您可以使用

您可以控制消息的序列化/反序列化方式,您可以指定特定操作的选择方式,总之,您可以在不更改契约的情况下实现您想要的。然而,这项工作肯定不仅仅是手动更新接口和实现

这是一个很好的资源,可以解释这些扩展点


如果您只想识别用户,您可以通过服务方法中的OperationContext.Current.ServiceSecurityContext来识别。这里有一个示例说明如何实现此目的。

如果要使用该附加参数更改每个operationContract的实现,那么更改签名并不是什么大问题


如果您不打算使用该参数,那么添加该参数有什么必要?

OP想要更改操作合同,而不是服务构造函数他可能会“假设”他需要更改操作合同,因为这似乎是唯一明显的选择。如果“otherParameter”不需要调用方传递,那么它是一个有效的解决方案。即使OP采用lambda方法,每个操作合同的参数值也不可能不同。为什么您认为每个操作合同都需要更改参数值?所以这方面没有希望,我会重写所有的。在调用部分,我可以自动添加参数吗?还是没有希望?@Arngrim因为您正在更改合同,所以您还必须更新客户端代码。如果您有想法和/或解决方案,我会在主帖子中添加一条注释,以添加有关上下文的详细信息。因此,下次开始定义服务时,您可以考虑在自定义类型上使用DATACONTRATS,这样,如果您需要一个新的参数,可以将其放在类型的基类型中,然后为您的操作指定特定的类型。但我还需要客户的计算机名,但我不确定这部分是否可以在web上下文中完成。您能告诉我们有关此新参数的上下文的更多信息吗?这是干什么用的?每次电话能换吗?如果没有,它是否会根据服务或操作合同进行更改?有关详细信息,我需要添加服务客户的标识参数,而无需在每个合同和调用中写入。好的,因此有可能从请求本身获取此信息,并将其作为参数注入服务构造函数。该机制将取决于服务的托管方式。您的WCF服务是如何托管的?(IIS/windows服务等)以及它使用什么身份验证协议?确定。您使用什么身份验证方法?我使用windows身份验证,需要将它们添加到SQL Server连接字符串中