如何覆盖或向单独类中的方法添加属性,以便刷新 WCF 服务不会影响我的更改?
Posted
技术标签:
【中文标题】如何覆盖或向单独类中的方法添加属性,以便刷新 WCF 服务不会影响我的更改?【英文标题】:How can I override or add an attribute to a method in a separate class so that refreshing a WCF service doesn't blow away my changes? 【发布时间】:2021-06-03 11:36:25 【问题描述】:我有许多使用代理包装的 WCF 服务,并且我为每个服务使用自动生成的合同类。
我看到有一些存根(例如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
,因为我不希望它显示在 Swagger 中,并且此字段是一个常量。当我刷新 WCF 时,它返回为 public
。
internal string PartitionKey // I changed public to internal
get
return this.partitionKeyField;
set
this.partitionKeyField = value;
【问题讨论】:
【参考方案1】:假设您添加了一个服务引用,并且 Visual Studio 生成了一个名为 MyServiceClient
的代理。它可能看起来像这样:
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
public partial class MyServiceClient : System.ServiceModel.ClientBase<MyService>
如您所见,如果您修改MyServiceClient
,如果您刷新服务引用,您的修改将被覆盖。要解决此问题,请不要直接修改它。相反,将其子类化。
public class MyModifiedServiceClient : MyServiceClient
//Make changes here
现在在您的 c# 的其余部分中,始终使用 MyModifiedServiceClient
,而不是使用 MyServiceClient
。刷新服务引用时,派生类不会被覆盖。
【讨论】:
我现在正在测试这个。看起来我只需要复制我想要隐藏的方法并将internal new
放在它们前面,然后我就可以用我想要的属性来装饰它们。我希望我可以做一个override
,这样我就可以调用基本方法,但是我必须用virtual
修改生成的合同方法,除非有更简单的方法,否则每次都会被覆盖。看起来这可能是我应该做的正确方式。
所以我的问题似乎与生成的合同有关,而不是与客户有关(除非我做错了?)。我已经创建了派生合同类,所以我有MyContractX : MyContract
,但是当我去提出我的客户请求时,它说“类型MyContractX
不是预期的”,因为它需要MyContract
。那么我是否必须复制/粘贴几乎整个生成的类才能保留更改?我创建了[Required, DefaultValue(Constants.DefaultCompany)] public new string Company get return base.Company; set base.Company = value;
以使该字段成为必填项
它告诉我使用XmlInclude
来识别意外类型?
我认为您不能更改合同。从服务器的角度来看,这将使 WCF 调用无效。为什么要给它们添加方法?
好吧,我真的只想做三件事。合同的要求、隐藏和默认值。我试过做ModelMetadataType
,它只适用于DefaultValue
属性,但由于某种原因不适用于Required
属性?如果我将Required
属性移动到实际合同中,它可以正常工作......所以我认为这是一些奇怪的错误?这种方法很有前途,但我不知道修改后如何使用合同。以上是关于如何覆盖或向单独类中的方法添加属性,以便刷新 WCF 服务不会影响我的更改?的主要内容,如果未能解决你的问题,请参考以下文章