在.net 2.0 web服务中调用PHP脚本


call PHP script within a .NET 2.0 web service

我想从。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();
}

(请。请看上面的评论。这些是我打过的电话。我是否错过了指定凭据的方法?)

谢谢各位,汤姆

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

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服务器上的身份验证。没有别的办法了。你必须使用向服务器显示您是有效用户的身份验证(基本启用);或者设置为public

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