我想从.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脚本的各个位置:
在所有三种情况下,我都收到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();
}
(请参阅上面的评论。这些是我试过的电话。我是否错过了指定凭证的方法?)
谢谢你们, 汤姆
答案 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。 换句话说,匿名用户被授予访问服务器的权限,但不允许在服务器上执行任何操作。 我在授权小程序中添加了一个允许规则,现在它可以运行了!