【问题标题】:How to consume credential based webservice (asmx) in Asp.net Core web application?如何在 Asp.net Core Web 应用程序中使用基于凭据的 Web 服务(asmx)?
【发布时间】:2017-02-28 05:03:35
【问题描述】:

在 .NetCore 控制台应用程序中添加 asmx 服务时遇到问题。我正在使用 WCF 连接服务扩展,因为添加 Web 引用不可用。所以,我遵循以下链接中建议的相同步骤 https://blogs.msdn.microsoft.com/webdev/2016/06/26/wcf-connected-service-for-net-core-1-0-0-and-asp-net-core-1-0-0-is-now-available/

完成所有步骤后,它提供了自动生成的引用类,其中包含所有方法作为异步方法。我的 asmx 服务需要对每个方法进行用户名和密码验证,我们将凭据作为任何方法的第一个参数传递。

例如,使用 web 引用我的方法看起来像 GetData(Credential credential) 但这里自动生成的类显示这个方法像 GetDataAsync() 所以我使用下面提到的代码在调用我的 Web 服务方法之前传递凭据

client.ClientCredentials.UserName.UserName = "我的用户名"; client.ClientCredentials.UserName.Password = "我的密码";

它给了我 Not Authorized 错误,在放置断点后我发现凭据没有在 asmx 服务中获取。

请提出一些解决方案。

【问题讨论】:

  • 你找到解决办法了吗?

标签: web-services wcf asp.net-core asp.net-core-mvc .net-core


【解决方案1】:

我之前采用的方法:
我遇到了类似的问题。我有一个 MVC Core Web 应用程序(针对 .NET Framework 4.6.1),并且无法像以前在以前的(非核心)应用程序中那样添加 Web 引用。我无法让 Connected Services 添加对 asmx 的引用并允许传递凭据。

为了解决这个问题,我创建了一个额外的项目(一个同样针对 .NET Framework 4.6.1 的类项目)。从那里我可以像过去那样添加 Web 参考。在这个项目中,我创建了一个具有可公开访问的方法的类,该方法调用 asmx 服务。

然后,在我的 MVC Core 项目中,我设置了对这个附加项目的引用,并且能够调用另一个项目的公共方法。

我发现的最新最好的方法:
我完全更新了 VS 2017 并访问此站点以获取最新的 WCF 连接服务扩展 (https://marketplace.visualstudio.com/items?itemName=WCFCORETEAM.VisualStudioWCFConnectedService)。

AuthorizationSoapHeader 易于访问和设置。

MySoapClient.EndpointConfiguration endpoint = new MySoapClient.EndpointConfiguration();  
MySoapClient myService = new MySoapClient(endpoint, myURL);              
AuthorizationSoapHeader MyAuthHeader = new AuthorizationSoapHeader();

MyAuthHeader.AppName = FDSServiceAppName;
MyAuthHeader.AppID = Guid.Parse(MyAppID); 

Entry[] entries = MyService.GetUsers().Result;

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,我通过 github issues 解决了它:

    在 Reference.cs 中替换

    System.ServiceModel.BasicHttpBinding result = new System.ServiceModel.BasicHttpBinding()
    

     System.ServiceModel.BasicHttpBinding result = new System.ServiceModel.BasicHttpBinding(System.ServiceModel.BasicHttpSecurityMode.TransportCredentialOnly);
                result.Security.Transport.ClientCredentialType = System.ServiceModel.HttpClientCredentialType.Basic;
    

    这在用于肥皂网络服务的 .net 核心客户端应用程序中确实有效

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-08
      • 2015-03-12
      相关资源
      最近更新 更多