我正在创建一个配置实用程序,可用于更改Web服务配置。我这样做是因为我的应用程序有很多exes并且包含很多配置文件。
这也用于更改Web服务的配置,因为有很多服务,我需要通过实用程序轻松地更改服务器和连接字符串中的虚拟目录。
所以我要做的是使用服务URL并尝试连接到它以检查是否可以建立连接而无需创建代理。
到目前为止,这就是我正在做的事情:
string url = "http://localhost/VirtualDirectory/Service.svc";
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.Credentials = new NetworkCredential("UserName", "Password");
using(HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
if (response.StatusCode == HttpStatusCode.OK)
{ MessageBox.Show("Connection successful!"); }
else
{ MessageBox.Show("Connection failed!!!"); }
}
但我得到“远程服务器返回错误:(401)未经授权。”,异常状态为“System.Net.WebExceptionStatus.ProtocolError” < / p>
但是当我尝试使用浏览器中的这些凭据连接到Web服务时,我能够连接并查看服务xml。
我不确定这是我做错了什么,或者IIS端是否有任何错误(IIS 7.5)。我看到,对于该服务,启用了匿名身份验证,并在IIS中禁用了休息。
我无法从另一个SO问题中得到解决方案。但它可能是重复的。请在这种情况下提供链接。
感谢。
答案 0 :(得分:1)
我也想出了问题和解决方案。我没有意识到该服务期待我没有提供的“授权”自定义标题,因为我没有注意到它。我的坏。
以下代码对我有用:
string url = @"http://" + ServerName + @"/" + VirtualDirectoryName
+ @"/Service.svc";
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
NetworkCredential nc = new NetworkCredential("Username", "Password");
request.Credentials = nc;
string credentials = "Username:Password";
request.Headers.Add("Authorization", "Basic "
+ Convert.ToBase64String(Encoding.Default.GetBytes(credentials)));
CredentialCache cache = new CredentialCache();
cache.Add(new Uri(url), "Basic", nc);
request.Credentials = cache;
request.PreAuthenticate = true;
bool pingSuccess = false;
var ping = new Ping();
PingReply reply;
try
{
reply = ping.Send(ServerName);
if (reply.Status == IPStatus.Success)
pingSuccess = true;
}
catch
{
string msg = "Connection to the server failed.\nCheck server name.";
MessageBox.Show(msg, _error, MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
if (response.StatusCode == HttpStatusCode.OK)
{
MessageBox.Show("Server connection successful!",
_info,
MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
else
{
if (pingSuccess)
{
string msg = "Server is Available but connection failed."
+ "\nCheck virtual directory name.";
MessageBox.Show(msg,
_error,
MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}
}