在.net核心项目中按环境加载WCF服务

vsmadaxz  于 2023-01-10  发布在  .NET
关注(0)|答案(5)|浏览(189)

我在.NET核心项目中添加WCF时遇到了问题。当我过去使用.NET时,我可以在web.config中添加多个环境,这样我就可以在运行时加载正确的Web服务(Dev,Rec,Prod)。
net核心项目中的问题当我将WCF服务的引用添加为Connected Service时,它创建了一个包含WCF服务URL的文件ConnectedService. json。

{
  "ProviderId": "Microsoft.VisualStudio.ConnectedService.Wcf",
  "Version": "15.0.20406.879",
  "GettingStartedDocument": {
    "Uri": "https://go.microsoft.com/fwlink/?linkid=858517"
  },
  "ExtendedData": {
    "Uri": "*****?singleWsdl",
    "Namespace": "Transverse.TokenService",
    "SelectedAccessLevelForGeneratedClass": "Public",
    "GenerateMessageContract": false,
    "ReuseTypesinReferencedAssemblies": true,
    "ReuseTypesinAllReferencedAssemblies": true,
    "CollectionTypeReference": {
      "Item1": "System.Collections.Generic.List`1",
      "Item2": "System.Collections.dll"
    },
    "DictionaryCollectionTypeReference": {
      "Item1": "System.Collections.Generic.Dictionary`2",
      "Item2": "System.Collections.dll"
    },
    "CheckedReferencedAssemblies": [],
    "InstanceId": null,
    "Name": "Transverse.TokenService",
    "Metadata": {}
  }
}

我的问题是如何根据使用的环境加载正确的服务。

注。

在我的项目中,我没有一个appsettings也没有网络配置。它是一个。net核心类库,它是在ASP.NET核心应用程序作为中间件调用。

6bc51xsx

6bc51xsx1#

我从this article了解到,这是微软的建议:
1.添加新类文件
1.添加与服务reference.cs相同的命名空间
1.添加部分类以扩展引用服务类(在Reference.cs中声明)
1.和部分方法来实现ConfigureEndpoint()(在Reference.cs中声明)
1.通过为终结点设置新值来实现ConfigureEndpoint()方法
示例:

namespace Your_Reference_Service_Namespace
{
    public partial class Your_Reference_Service_Client
    {
        static partial void ConfigureEndpoint(System.ServiceModel.Description.ServiceEndpoint serviceEndpoint, System.ServiceModel.Description.ClientCredentials clientCredentials)
        {
            serviceEndpoint.Address = 
                new System.ServiceModel.EndpointAddress(new System.Uri("http://your_web_service_address"), 
                new System.ServiceModel.DnsEndpointIdentity(""));
        }
    }
}

1.在这里,您可以从appsettings.json文件中获取值
新建系统. URI(配置. GetValue("您的服务地址")

bq3bfh9z

bq3bfh9z2#

对于那些对解决方案感兴趣的人,我在每个appsetings.{environment}.json中为我的服务添加了一个端点,并在Service类中基于环境变量ASPNETCORE_ENVIRONMENT注入了我的服务的新示例

services.AddTransient<Transverse.TokenService.ITokenService>(provider =>
        {
            var client = new Transverse.TokenService.TokenServiceClient();
            client.Endpoint.Address = new System.ServiceModel.EndpointAddress(Configuration["Services:TokenService"]);
            return client;
        });

也许不是最好的,但效果很好。

vhmi4jdf

vhmi4jdf3#

我使用的是. Net Core 3.1,这是我调用WCF服务的方式。

var sUserClientRemoteAddress = _configuration.GetValue<string>("WCFRemoteAddress:UserClient");
UserClient userService = new UserClient(UserClient.EndpointConfiguration.CustomBinding_IUser, sUserClientRemoteAddress);

首先,从appsettings.json获取端点远程地址
其次,使用CTOR WCF客户端类参数中的地址调用Web服务客户端
先谢了。

rsl1atfo

rsl1atfo4#

使用ChannelFactory来使用您的服务。WCF ChannelFactory vs generating proxy
ChannelFactory允许您设置EndpointAddress . How to: Use the ChannelFactory
端点的URL可以从配置文件加载。在更高级的设置中,可以执行服务的目录查找以检索部署应用程序的环境的URL。https://en.wikipedia.org/wiki/Service_provider_interface
https://github.com/jolmari/netcore-wcf-service-proxy
在ASP.NET核心Web应用程序中使用代理实现使用多个WCF服务的示例。

bhmjp9jg

bhmjp9jg5#

我只是走简单的路线。

步骤1:

按照MSFT指南中的以下步骤添加服务引用:
https://learn.microsoft.com/en-us/dotnet/core/additional-tools/wcf-web-service-reference-guide

第二步:

创建工厂以创建WCF服务客户端。您可以从主项目或任何您想要的地方传递wcfUriBasedOnEnvironment

public static class WCFServicesClientFactory
{
    // APIWCFServicesClient is the service client inside Reference.cs generated in Step 1
    public static APIWCFServicesClient CreateUsingUri(string wcfUriBasedOnEnvironment)
    {
        return new APIWCFServicesClient(APIWCFServicesClient.EndpointConfiguration.BasicHttpsBinding_IAPIWCFServices, new System.ServiceModel.EndpointAddress(new System.Uri(wcfUriBasedOnEnvironment)));
    }
}

第三步:

像这样使用它:

var wcfClient = WCFServicesClientFactory.CreateUsingUri("http://your_web_service_address");

相关问题