2013-04-23 111 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); 
     } 
    } 
}