例如,当从开发环境切换到生产环境时,如何更改WSDL引用



我的团队正在构建一个API,它与具有许多端点的另一个API接口。我们的应用程序是在。net核心,所以我们一直使用连接服务向导的每个引用。这意味着我们必须为端点指定URI。

一切都如预期的那样工作,但是当我们从dev/qa移到staging时,所有这些引用都将是错误的,我将不得不手动切换连接的服务url(我想我可以通过简单地访问ConnectedService来做到这一点)。Json用于每个引用和更改扩展数据:输入:"[url]"到不同的url,但这意味着每次我们改变环境时都要改变~20个(到目前为止)引用。

我的老板说,随着范围的扩大,它将变得难以管理。是否有一种方法可以实现服务引用uri的依赖注入,以便当环境发生变化时,我可以在代码中自动更改引用?(我将有参考基础url保存在应用设置。因此我们可以在不重新编译的情况下更改它,因为基本url由所有服务共享,并且它末尾的WSDL名称对于跨环境的每个引用保持相同。

我之所以把这个问题作为一个新问题来问是因为,首先,在。net核心实现服务引用的向导上,帮助有限。我找到的大多数解决方案都是10-15年前的,我花了一天的时间才意识到这些解决方案并不适用。这里有一个相关解决方案的例子:更改WCF参考Url。net Core,然而,我完全不理解所提出的解决方案。

在解决方案中,OP说添加代码var client = new GetUrlContractClient(new BasicHttpBinding(), new Endpoint("https://someurl/v3/GetUrl-Prod.svc");解决了更新uri的问题。我的问题是,这些代码在哪里,这个客户端对象是什么?当我调用我们引用的API时,我异步地创建了一个新对象,没有引用一些先前存在的变量,如上面的client…我们是否已经在某个地方实现了这个,只是我没有看到它?调用的GetUrlContractClient是什么?我不明白OP在哪里使用这个,如果他们使用向导设置引用。

[编辑]我应该说,我还发现实现部分方法"ConfigureEndpoint"扩展自动生成的代码是"首选的解决方案",如图所示,在。net core项目中通过环境加载WCF服务。当我尽力为其中一个引用这样做时,它会抛出一个安全异常。如果这是正确的方法,那么我将花时间解决这个错误。然而,这个解决方案涉及到为每个引用扩展ConfigureEndpoint,所以我必须这样做15次以上,所以在我看来,这不是解决方案。也许这就是参考问题的OP正在做的事情,但如果是这样的话,我看不到连接。他们似乎是完全不同的解决方案。

似乎这将是一个相对直接的事情来查找和解决我们已经实现的,但我没有运气。每当我找到一些东西,答案就像上面那样模糊,我不知道它如何适用于我的情况。如何更改使用web服务引用向导设置的web服务引用的uri ?

为每个连接的服务扩展ConfigureEndpoint工作。该路径不能在末尾不包含?wsdl。扩展代码(我的一个文件)如下。

public partial class CreateOrderPortTypeClient
{
const string uriSuffix = "(last part of URI without ?wsdl)";
static partial void ConfigureEndpoint(System.ServiceModel.Description.ServiceEndpoint serviceEndpoint, System.ServiceModel.Description.ClientCredentials clientCredentials)
{
EndpointCreator.SetServiceEndpointAddress(serviceEndpoint, uriSuffix);
}
}

我还添加了一个类EndpointCreator来处理基址,如下所示。

public class EndpointCreator
{
static string uriBase;

public static void GenerateBaseAddress(string uriBase)
{
EndpointCreator.uriBase = uriBase;
}
public static void SetServiceEndpointAddress(System.ServiceModel.Description.ServiceEndpoint serviceEndpoint, string uriSuffix)
{
serviceEndpoint.Address =
new System.ServiceModel.EndpointAddress(new System.Uri(uriBase + uriSuffix),
new System.ServiceModel.DnsEndpointIdentity(""));
}
}

我在启动时通过访问配置分配了uriBase。虽然我不得不逐个扩展,它实际上非常易于管理,因为这是一个小的事情当添加一个新的服务通过向导。

最新更新