尝试将 ASP.NET CORE 2 Web API 应用程序连接到 WCF 服务

Posted

技术标签:

【中文标题】尝试将 ASP.NET CORE 2 Web API 应用程序连接到 WCF 服务【英文标题】:Trying to connect ASP.NET CORE 2 Web API app to WCF service 【发布时间】:2019-08-17 03:33:51 【问题描述】:

我昨天开始了一个 POC 项目以连接到现有的 WCF 服务,我正在使用 .Net Core 2.1 Web API 应用程序和 Swagger 来发布我的测试请求消息。我正在为 BasicHttpSecurityMode 使用 BasicHttpBinding 和 Transport。

在发送测试请求消息时,我收到以下异常:

“HTTP 请求未使用客户端身份验证方案‘匿名’。从服务器接收到的身份验证标头是‘基本领域’。”

然后,我使用 .NET Framework 4.6.1 创建了一个 Microsoft Web API 项目来调用 WCF 服务,并且能够获得状态代码 200 HTTP 响应。

在我看来,这像是 .NET Core 2 Web API 项目连接到 WCF 服务的问题。我做了一些研究,看起来这种设计架构绝对是可能的。

微软甚至开发了一个提供者工具来做到这一点,这里是关于他们的提供者工具的 MS 文章的链接:https://docs.microsoft.com/en-us/dotnet/core/additional-tools/wcf-web-service-reference-guide

我什至尝试让我的 .NET Core Web API 控制器调用我在 .NET 4.6.1 类库项目中构建的处理程序类,但无济于事,我仍然收到“HTTP 请求未经客户端身份验证方案授权'基本的'。从服务器收到的身份验证标头是“基本领域”。”例外。

private static System.ServiceModel.Channels.Binding GetBindingForEndpoint(EndpointConfiguration endpointConfiguration)
        
            if ((endpointConfiguration == EndpointConfiguration.BasicHttpBinding_IInsuranceService))
            
                System.ServiceModel.BasicHttpBinding result = new System.ServiceModel.BasicHttpBinding();
                result.MaxBufferSize = int.MaxValue;
                result.ReaderQuotas = System.Xml.XmlDictionaryReaderQuotas.Max;
                result.MaxReceivedMessageSize = int.MaxValue;
                result.AllowCookies = true;
                result.Security.Mode = System.ServiceModel.BasicHttpSecurityMode.Transport;
                return result;
            
            throw new System.InvalidOperationException(string.Format("Could not find endpoint with name \'0\'.", endpointConfiguration));
        

        private static System.ServiceModel.EndpointAddress GetEndpointAddress(EndpointConfiguration endpointConfiguration)
        
            if ((endpointConfiguration == EndpointConfiguration.BasicHttpBinding_IInsuranceService))
            
                return new System.ServiceModel.EndpointAddress("https://myservicebaseURL\myservice.svc");
            
            throw new System.InvalidOperationException(string.Format("Could not find endpoint with name \'0\'.", endpointConfiguration));
        

【问题讨论】:

Basic认证需要配置result.Security.Transport.ClientCredentialType = System.ServiceModel.HttpClientCredentialType.Basic;并确保this.ChannelFactory.Credentials.UserName.UserName = "yourusername"; this.ChannelFactory.Credentials.UserName.Password = "yourpassword";提供正确的用户名和密码 感谢您的帮助。不幸的是,我已将您上面列出的配置设置添加到我的服务的 Reference 类并设置了用户名和密码凭据,但我仍然遇到相同的异常。这可能是 Visual Studio 在 IISExpress 中启动应用程序的问题吗? 以下是我的 launchSettings.json 文件中的设置: "iisSettings": "windowsAuthentication": false, "anonymousAuthentication": true, "iis": "applicationUrl": "localhost/mywebapi" , "sslPort": 0 , "iisExpress": "applicationUrl": "localhost:63143", "sslPort": 44331 , 您是如何创建 WCF 服务的?是否有任何演示可以重现您的问题? 【参考方案1】:

感谢大家的意见。按照article 中详述的步骤,我能够解决我的问题。

请阅读下面的更新代码以从我的 .NET Core 2 Web Api 调用 WCF 服务:

 public async Task<DataFetchServiceResponseUsingPatient> FetchEntity(String ID)
    
      var userName = _authenticationSettings.Value.UserName;
      var password = _authenticationSettings.Value.Password;
      var url = _authenticationSettings.Value.Url;

      var basicHttpBinding = new BasicHttpBinding(BasicHttpSecurityMode.Transport);

      basicHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
      ChannelFactory<IMyService> factory = null;
      factory = new ChannelFactory<IMyService>(basicHttpBinding, new EndpointAddress(new Uri(url)));
      factory.Credentials.UserName.UserName = userName;
      factory.Credentials.UserName.Password = password;
      var serviceProxy = factory.CreateChannel();
      ((ICommunicationObject)serviceProxy).Open();
      var opContext = new OperationContext((IClientChannel)serviceProxy);
      var prevOpContext = OperationContext.Current;
      OperationContext.Current = opContext;

      var result = await serviceProxy.MyWCFServiceMethod(ID);

      //Cleanup Factory Objects
      factory.Close();
      ((ICommunicationObject)serviceProxy).Close();
      return result;    
    

【讨论】:

以上是关于尝试将 ASP.NET CORE 2 Web API 应用程序连接到 WCF 服务的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP .NET Core 2.1 Web Api 中启用 CORS

如何将 AzureAD 和 AzureADBearer 添加到 asp.net core 2.2 web api

如何在 ASP.NET (Core 2) Web 应用程序中访问来自 AWS 的认证?

如何使用 fetch 将 FormData 从 javascript 发送到 ASP.NET Core 2.1 Web API

ASP.NET Core Web API:尝试激活时无法解析服务类型

Asp.net core 2.1 Web App 无法在 IIS 上正确呈现