3

我的问题是在 ASP.NET MVC 中调用经过身份验证的(具有用户名和密码)Web 服务(asmx)

我做了以下事情:

  1. 我通过向解决方案添加服务引用将 Web 服务添加到项目中
  2. 尝试wsdl.exe使用以下命令语法使用工具创建服务的代理类

    wsdl /username:******** /password:************* /domain:********** web service url.asmx?wsdl

但它给了我以下错误:

下载时出错web service url://???.asmx?wsdl。请求失败并显示 HTTP 状态401: Unauthorized

我可以通过提供用户名和密码在浏览器中查看服务。

当我搜索 using svcutil.exeto create proxy 类时,我发现它不能用于经过身份验证的 Web 服务。

我想问是否有另一种创建代理类的方法,或者我们是否可以在没有代理类的 asp.net mvc 应用程序中调用经过身份验证的 Web 服务。

4

1 回答 1

4

我有一个具有相同行为的项目,一个 Web 服务 (asmx) 在 VPN 后面,他们使用用户名/密码来访问它,但在 VPN 内部它没问题。

直接从 Visual Studio生成代理类会很困难(可能缺乏对此类场景的支持),但只要您可以在浏览器中看到架构(wsdl 部分),这个技巧就很简单。

这样做

  1. 在浏览器中打开?wsdl链接,进入Source Code模式并将整个代码复制到本地计算机中的文件中,假设c:\temp并调用service.wsdl
  2. 复制svcutil.exec:\temp(它在 .NET Framework 文件夹中,只需搜索它
  3. c:\temp在(文件夹内的Shift+Right Click并选择在此处打开命令窗口)中打开一个终端
  4. 运行以下命令:svcutil service.wsdl /out:proxy.cs /config:proxy.config

这将生成 2 个文件,proxy.csproxy.config

  • proxy.cs是您的 Web 服务包装器,您只需添加到您的项目中
  • proxy.config具有<system.serviceModel>您需要附加到web.config文件的内容。

现在,您需要做的就是遵循生成的包装器并编写如下内容:

// Web Service initialization and authentication
client = new MyNamespace.ServiceSoapClient();
client.ClientCredentials.UserName.UserName = cUser;
client.ClientCredentials.UserName.Password = cPass;

// do something
client.InsertCompetitor(model);

// close connection
if (client != null && client.State == System.ServiceModel.CommunicationState.Opened)
    client.Close();
于 2013-07-15T22:55:32.890 回答