2013-04-23 85 views
0

我正在创建一个可用于更改Web服务配置的配置实用程序。我这样做是因为我的应用程序有很多exes,并且包含很多配置文件。WCF Web服务连接测试实用程序

这也用于更改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中禁用了其余的功能。

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

谢谢。

+0

你为什么不使用通道工厂消耗你的服务?你有webHttpBinding端点吗? – Alex 2013-04-23 13:29:14

+0

我不想使用ChannelFactory的原因是因为我不想使用该服务。我只想确保用户输入的新服务器名称和虚拟目录是正确的,并且可以建立连接。我不想做很多工作,只需建立连接并关闭它。 – 2013-04-23 13:48:12

回答

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