【问题标题】:Consume web service in asp.net app from a class library从类库中使用 asp.net 应用程序中的 Web 服务
【发布时间】:2011-02-16 15:19:39
【问题描述】:

我和我的团队有一个 asp.net Web 表单应用程序,并且正在使用多个类库。在其中一个库中,我们正在尝试使用 Web 服务。 Web 引用已添加到 Web 应用项目中,并且已添加相应的引用。应用程序编译。当尝试在类库中使用所述 Web 服务时,凭据似乎不起作用,并且调用失败。但是,如果我们将 Web 服务调用从类库中取出,并在 Web 应用程序中使用它,它就可以工作。

关于为什么这在类库中不起作用的任何想法。

【问题讨论】:

  • 如果您从类库中使用服务引用,则应将服务引用添加到类库中。
  • 您是指添加实际的 Web 引用,还是 System.Web.Services 引用。
  • 我建议您使用“添加服务引用”而不是“添加 Web 引用”,并将其添加到类库中。
  • 听起来是 Brian 帮助您找到了解决方案,请考虑将他的答案标记为正确答案。
  • stackoverflow.com/questions/13188860/… 我认为您可以在此链接中看到您的问题的解决方案。我遇到了同样的问题。我想从 web 服务中获取对象而不调用 AddWebReference。谢谢

标签: c# asp.net web-services asmx


【解决方案1】:

仔细检查您的配置文件是否包含正确的 Web 服务信息。

尝试将 URL 行为也更改为动态。

另外,正如 John 所说,我假设您将服务添加到类库中,因为您打算从库中使用它,而不是 Web 应用程序的其他区域。

“凭据似乎不起作用,并且调用失败”...您能给出错误的小堆栈跟踪吗?

澄清一下,在我当前的项目中,我们在类库中使用 WCF 端点以及绑定和凭据。可以对您尝试的 SOAP ASMX Web 引用执行相同的操作。

【讨论】:

  • 请求失败,HTTP 状态 401:未授权。在执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常起源和位置的信息。
  • [WebException: 请求失败,HTTP 状态 401:未授权。] System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall) +1484609 系统。 Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] 参数) +221
  • TRM.WebApp.webservices.clearview.com.ClearviewServicesV2.GetDTOContactV2ByAccountAndSSN(String accountNumber, String ssn) in C:\WINDOWS\Profiles\mmcdowell\My Documents\VS2010\TRM\Development-IdentityManagement\WebApp \Web 引用\webservices.clearview.com\Reference.cs:336
  • TRM.Identity.Management.ASPSecuritySetupService.GetClearviewContactForAccountAndSSN(String accountNumber, String ssn) in C:\WINDOWS\Profiles\mmcdowell\My Documents\VS2010\TRM\Development-IdentityManagement\WebApp\OAMIdentityManagement\ASPSecuritySetupService .cs:558 Accounts_Account_Login.LoginButton_OnClick(Object sender, EventArgs e) 在 C:\WINDOWS\Profiles\mmcdowell\My Documents\VS2010\TRM\Development-IdentityManagement\WebApp\Account-Registration\Account-Login.aspx.cs:237
  • 根据堆栈跟踪,我对这个很愚蠢...您可能缺少凭据的配置条目。
【解决方案2】:

您可以通过执行以下步骤添加 Web 服务引用:

  1. 右键单击解决方案资源管理器中的项目
  2. 点击添加服务参考
  3. 点击高级
  4. 您会在表单末尾找到“添加 Web 参考”

【讨论】:

  • 他为什么要使用网络参考?
  • @john-saunders 我以为他想按照他的描述将它添加到解决方案中!但现在修改后,他的身份验证问题而不是访问权限
【解决方案3】:

如果您在应用程序中添加引用,然后从类库中使用它...您如何调用类库..通过添加引用并调用类库的方法,然后您如何从类库访问代理你需要参考它......在我看来这是一个循环参考。哪个不应该首先编译...您是否正确描述了您的结构?

最好先添加一个仅包含 Web 引用的简单项目,然后将此项目的引用添加到所有需要它的项目中。

【讨论】:

    【解决方案4】:

    您可以通过执行以下步骤添加 Web 服务引用:

    右键单击解决方案资源管理器上的项目 单击添加服务参考 单击高级 您将在表单末尾找到“添加 Web 参考”

    通过@AMgdy 的解决方案,它会自动生成一个Reference.cs 类。它定义了webservices 的所有方法。

    【讨论】:

      【解决方案5】:

      可能是你说错了!! 这是一个例子:

      var serviceName = new ServiceName
          {
              Credentials = new NetworkCredential("Username", "Password", "Domain"),
              Url = "Here you put the correct url of the web service if you published somewhere else"
          };
      serviceName.CallWebMethod();
      

      确保您输入了正确的凭据用户名和密码,并确保您已将 Web 服务发布到您访问它的位置。

      【讨论】:

        【解决方案6】:

        您是否在网络应用程序的配置文件中定义了任何凭据信息?如果是这样,类库可能无法正确获取它们。不过只是猜测。约翰桑德斯是对的。阅读您对应用程序结构的描述似乎有点倒退。

        【讨论】:

        • 好的,一切正常。在类库中添加了 Web 引用,在 Web 应用程序中使用类库。所有编译和工作。事实证明,在 appSettings 中为特定用户输入了密码。感谢所有的帮助。 :)
        猜你喜欢
        • 1970-01-01
        • 2020-08-30
        • 1970-01-01
        • 2012-04-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-28
        • 2014-02-24
        • 1970-01-01
        相关资源
        最近更新 更多