在.NET 2.0 Web服务中调用PHP脚本

时间:2013-04-30 08:33:45

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

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

(请参阅上面的评论。这些是我试过的电话。我是否错过了指定凭证的方法?)

谢谢你们, 汤姆

2 个答案:

答案 0 :(得分: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服务器上的身份验证。别无他法。你必须使用   验证以显示服务器您是基本启用的有效用户,   或将其设置为公开。

答案 1 :(得分:0)

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