在.net 2.0 web服务中调用PHP脚本
本文关键字:调用 PHP 脚本 服务 web net | 更新日期: 2023-09-27 18:11:32
我想从。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失败。换句话说,匿名用户被授予对服务器的访问权限,但不允许在服务器上执行任何操作。我在授权小程序中添加了一个允许规则,现在它工作了!