C# 如何重写或向单独类中的方法添加属性,以便刷新WCF服务不会';不要把我的零钱挥霍掉?
我有许多WCF服务,我正在用代理包装它们,并且我为每个服务使用自动生成的契约类 我看到有一些存根(例如,C# 如何重写或向单独类中的方法添加属性,以便刷新WCF服务不会';不要把我的零钱挥霍掉?,c#,asp.net,asp.net-core,wcf,asp.net-core-mvc,C#,Asp.net,Asp.net Core,Wcf,Asp.net Core Mvc,我有许多WCF服务,我正在用代理包装它们,并且我为每个服务使用自动生成的契约类 我看到有一些存根(例如,static partial void ConfigureEndpoint),我可以将它们放在一个单独的类中,但是当我更新/刷新WCF服务时,我做了其他契约更改,这些更改会被吹走。我对C#/ASP.NET-Core的某些上下文非常陌生 下面是合同中的一个更改示例,其中我添加了一个属性以默认公司…如何通过WCF刷新以某种方式保持该属性 [DefaultValue(Constants.De
static partial void ConfigureEndpoint
),我可以将它们放在一个单独的类中,但是当我更新/刷新WCF服务时,我做了其他契约更改,这些更改会被吹走。我对C#/ASP.NET-Core的某些上下文非常陌生
下面是合同中的一个更改示例,其中我添加了一个属性以默认公司…如何通过WCF刷新以某种方式保持该属性
[DefaultValue(Constants.DefaultCompany), Required] // I added this because I want to default a company
public string Company
{
get
{
return this.companyField;
}
set
{
this.companyField = value;
}
}
我所做的另一个示例更改是将此方法的public
更改为internal
,因为我不希望它以虚张声势的形式显示,并且此字段是一个常量。当我刷新WCF时,它返回为public
internal string PartitionKey // I changed public to internal
{
get
{
return this.partitionKeyField;
}
set
{
this.partitionKeyField = value;
}
}
假设您添加了一个服务引用,VisualStudio生成了一个名为
MyServiceClient
的代理。它可能看起来有点像这样:
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
public partial class MyServiceClient : System.ServiceModel.ClientBase<MyService>
{
现在,在c#的其余部分中,不要使用
MyServiceClient
,而是始终使用MyModifiedServiceClient
。刷新服务引用时,派生类不会被覆盖。我现在正在测试。看起来我只需要复制我想要隐藏的方法,并将internal new
放在它们前面,然后我就可以用我想要的属性来装饰它们了。我希望我可以做一个覆盖
,这样我就可以调用基本方法,但是我必须用虚拟
修改生成的契约方法,除非有更简单的方法,否则每次都会被覆盖。这看起来可能是我应该做的正确方式。所以我的问题似乎与生成的合同有关,而不是客户(除非我做错了?)。我已经创建了派生合同类,所以我有了MyContract:MyContract
,但是当我去提出我的客户请求时,它说“TypeMyContract
不是预期的”,因为它预期MyContract
。那么,我是否必须复制/粘贴几乎整个生成的类才能持久化更改?我已经创建了[Required,DefaultValue(Constants.DefaultCompany)]公共新字符串Company{get{return base.Company;}set{base.Company=value;}}}
以使字段成为必需字段。它告诉我使用xmlclude
来识别意外的类型?我认为您不能更改合同。从服务器的角度来看,这将导致WCF调用无效。你为什么要给它们添加方法?我只想做三件事。需要、隐藏和默认合同值。我尝试过使用modelmatatype
,但它只适用于DefaultValue
属性,而不适用于Required
属性,原因是什么?如果我将Required
属性移动到实际的合同中,它工作得很好…所以我认为这是一些奇怪的错误?这种方法很有前途,但我不知道一旦修改合同,我如何使用。
public class MyModifiedServiceClient : MyServiceClient
{
//Make changes here
}