【问题标题】:SharePoint web services "Unable to connect to the remote server"SharePoint Web 服务“无法连接到远程服务器”
【发布时间】:2009-07-30 17:15:52
【问题描述】:

尝试在我们的一个平台上调用 SharePoint 的 Web 服务时出现错误。首先,我们有开发 (DEV)、测试 (QA) 和生产 (PROD) SharePoint 服务器。 QA 和 PROD 服务器几乎相同。我们有一个 ASP.NET Web 服务,它作为一个单独的应用程序放在它们上。我们的数据输入表单通过 Web 服务插入/更新到 SQL 数据库中,并且在某些情况下调用一些 SharePoints Web 服务(列表、dws)。

我们在从我们的 Web 服务调用 PROD 上的 SharePoint 的 Web 服务时遇到了问题,但是在 QA(或 DEV)上没有问题。在我们的 Web 服务代码中,我们有一个对 SharePoint Web 服务(列表和 dws)的 Web 引用。当通过我们的一种表单进行新条目时,我们尝试调用这些 Web 服务来创建列表项/文件夹。在 QA 上,创建列表项/文件夹没有问题。填写表格,调用我们的 Web 服务——它调用 SharePoint Web 服务并创建列表项/文件夹。

在 PROD 上,当我们尝试调用 SharePoint Web 服务时出现以下错误:

无法连接到远程服务器

在 System.Net.HttpWebRequest.GetRequestStream() 在 System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(字符串方法名,对象 [] 参数) ...

但是,为了更有趣,如果我直接从我的个人计算机调用 PROD SharePoint Web 服务,则创建列表项/文件夹没有问题。只有当我们的 Web 服务尝试调用 PROD SharePoint Web 服务时,我们才会遇到问题。我们查看了许多不同的 web.config 文件,寻找 QA 和 PROD 的差异,但还没有提出任何建议。

如果有人有任何指点,他们将不胜感激。谢谢。

更新:我刚刚尝试重构上述方法以使用 SharePoint 对象模型 API,但遇到了未经授权的错误。使用对象模型 API 时,凭据似乎没有正确传递,因为它正在尝试使用 MOSS 服务器凭据。有什么方法可以告诉它要使用哪些凭据,就像您使用 Web 服务 api 一样?

docLibList.Credentials = System.Net.CredentialCache.DefaultCredentials;

谢谢。

【问题讨论】:

  • 调用 SharePoint Web 服务的 ASP.NET 服务是否位于相同的服务器(QA 和 PROD)上?如果是这样,为什么不直接使用 ASP.NET 服务调用对象模型?
  • 从另一个服务调用同一个盒子上的网络服务是没有意义的......

标签: web-services sharepoint


【解决方案1】:

肖恩,

我不确定我是否完全理解您的调用模式,但如果您确实在同一个盒子上循环回 Web 服务,您可能会遇到臭名昭著的循环问题:

https://serverfault.com/questions/32345/ie-8-authentication-denied-on-local-sharepoint-site/32485#32485

简而言之:执行基于主机名的 HTTP 调用并返回到发出它们的服务器可能会被阻止。如果环回问题正在发生,您将能够从另一个盒子调用 PROD 中的 Web 服务......但不能从 PROD 盒子本身调用(即循环返回)。我认为这与您上面描述的行为一致。

如果您的环境之间的 Windows 补丁级别不同,这可能可以解释为什么您的代码在 PROD 中失败,但在其他环境中却没有。

我希望这会有所帮助!

【讨论】:

    【解决方案2】:

    这可能不是问题,而是您对指向生产服务器的 Web 服务的引用正确。在尝试访问错误引用的 SP 服务之前,我遇到了问题。我指向的开发服务器位于单独的域中,无法找到。

    【讨论】:

      【解决方案3】:

      关于您关于使用对象模型的未授权错误的问题的更新:

      根据您的代码运行的上下文,您有时需要提升权限。有关详细信息,请参阅此 Elevation of Privilege MSDN 文章(另请注意末尾的社区评论)。还有一个Visual How-To。

      另一种方法是创建new SPSite object using a SPUserToken object。有更多信息in this blog post by Daniel Larson。对于系统帐户,这将使用代码完成:

      SPSite site = new SPSite(SPContext.Current.Site.ID,
                               SPContext.Current.Site.SystemAccount.UserToken); 
      

      顺便说一句,下次最好在自己的问题中,这样才能正确投票和回答。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-21
        • 1970-01-01
        相关资源
        最近更新 更多