【问题标题】:call PHP script within a .NET 2.0 web service在 .NET 2.0 Web 服务中调用 PHP 脚本
【发布时间】:2013-04-30 08:33:44
【问题描述】:

我想从 .NET 2.0 SOAP Web 服务(用 C# 编写)中发出 HTTP Web 请求。我无法将调用实现为 [WebMethod],因为这是一个已经存在的 PHP 脚本,应该在 Web 服务中重复使用。

SOAP Web 服务在 IIS 上运行,虚拟目录受 NTLM 身份验证保护。 Web 服务运行良好。 我在 web.config 中有以下行:

<authentication mode="Windows" />

在 Web 方法中,我想调用一个名为 convertString 的函数。这调用了一个转换字符串的 PHP 脚本。我尝试了 PHP 脚本的不同位置:

  • 在其原始目录中(受 NTLM 身份验证保护)
  • 在 Web 服务虚拟目录中
  • 在具有匿名访问权限的目录中

在所有三种情况下,我都会收到 HTTP 错误 401 - 未经授权。 它仅在明确指定用户名、密码和域时才有效。但我真的很想避免这种情况。 有谁知道,为什么会这样?

函数代码如下:

public string convertString(string raw)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://server/directory/convtext.php?string=" + raw);
    request.Credentials = new NetworkCredential(user, pass, domain);  // This works! But I would like to avoid this line...
    // request.UseDefaultCredentials = true; // This does not work
    // request.Credentials = CredentialCache.DefaultCredentials; // This does not work
    // request.Credentials = CredentialCache.DefaultNetworkCredentials; // This does not work
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    StreamReader input = new StreamReader(response.GetResponseStream());
    return input.ReadToEnd();
}

(请参阅上面的 cmets。这些是我尝试过的调用。我错过了指定凭据的方法吗?)

谢谢各位, 汤姆

【问题讨论】:

    标签: c# php .net web-services soap


    【解决方案1】:

    我认为服务器正在请求基本身份验证。试试这个:

    System.Net.CredentialCache credentialCache = new System.Net.CredentialCache(); 
    credentialCache.Add(
        new System.Uri("http://www.yoururl.com/"),
        "Basic", 
        new System.Net.NetworkCredential("username", "password")
    );
    

    如您所见,它与您的代码非常相似:

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://server/directory/convtext.php?string=" + raw);
        request.Credentials = new NetworkCredential(user, pass, domain);
    

    两者都有效。

    如果你想避免这条线,你必须禁用基本 在 php web 服务器上进行身份验证。没有其他方法可以做到。你必须使用 向服务器显示您是启用了基本用户的有效用户的身份验证, 或将其设置为公开。

    【讨论】:

    • 我已经尝试将脚本放入禁用身份验证的目录中。我仍然收到错误 401。作为另一种选择,我将重新使用用于调用 Web 服务的相同凭据。我绝对不想在代码中硬编码用户名和密码。
    • 你在使用 apache 吗?使用 apache 安装附带的 htpasswd.exe 程序来创建 .htpasswd_private。如果您在 IIS 中使用 PHP,只需禁用应用程序的基本身份验证
    • 我正在使用 IIS。 PHP 脚本与 .NET Web 服务位于同一 Web 服务器上(我们在服务器上安装了 ASP 和 PHP)。我关闭了PHP脚本所在目录的匿名身份验证以外的所有身份验证方法,但仍然出现401错误。 (顺便说一句,在 SOAP Web 服务上,我正在使用 Windows 身份验证,并且我想将用于对 Web 服务进行身份验证的相同凭据也用于 PHP 脚本。第二个最佳选择是匿名访问 PHP scipt,但两者都不起作用。)
    【解决方案2】:

    现在我终于找到了解决问题的方法。 从 .NET Web 服务调用 php 脚本现在工作正常。 我不使用身份验证(我使用匿名访问)。它之前不起作用的原因不是身份验证设置中的错误设置(它们已正确设置为允许匿名访问),而是 AUTHORIZATION 设置中的错误设置。因此,不是 AUTHENTICATION 失败,而是 AUTHORIZATION。 换句话说,匿名用户被授予访问服务器的权限,但不允许在服务器上做任何事情。 我在授权小程序中添加了一条允许规则,现在它可以工作了!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-29
      • 1970-01-01
      • 1970-01-01
      • 2010-12-10
      相关资源
      最近更新 更多