0

我想从 .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 auth 保护)
  • 在 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();
}

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

谢谢大家,汤姆

4

2 回答 2

0

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

于 2013-09-02T18:17:54.900 回答
0

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

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 服务器上的基本身份验证。没有其他方法可以做到。您必须使用身份验证向服务器显示您是启用了基本功能的有效用户,或者将其设置为公共。

于 2013-04-30T08:38:58.283 回答