0

我正在创建一个可用于更改 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”

但是,当我尝试使用浏览器中的这些凭据连接到 Web 服务时,我能够连接并查看服务 xml。

我不确定这是否是我做错了,或者 IIS 方面是否有任何问题(IIS 7.5)。我看到对于该服务,在 IIS 中启用了匿名身份验证并禁用了 rest。

我无法从另一个 SO 问题中得到解决方案。但它可能是重复的。在这种情况下,请提供链接。

谢谢。

4

1 回答 1

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);
        }
    }
}
于 2013-04-29T10:27:17.250 回答