WCF Web服务连接测试实用程序

时间:2013-04-23 13:26:16

标签: wcf c#-4.0 authentication

我正在创建一个配置实用程序,可用于更改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问题中得到解决方案。但它可能是重复的。请在这种情况下提供链接。

感谢。

1 个答案:

答案 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);
        }
    }
}