2013-04-23 2 views
0

웹 서비스 구성을 변경하는 데 사용할 수있는 구성 유틸리티를 만들고 있습니다. 내 응용 프로그램이 exe를 많이 가지고 있으며 많은 구성 파일을 포함하고 있으므로이 작업을 수행하고 있습니다.WCF 웹 서비스 연결 테스트 유틸리티

많은 서비스가 있기 때문에 웹 서비스의 구성을 변경하는데도 사용됩니다. 유틸리티를 통해 연결 문자열에서 서버와 가상 디렉터리를 쉽게 변경하고 변경할 수있는 방법이 필요합니다.

그래서 내가하려는 것은 서비스 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"

입니다하지만 브라우저에서 이러한 자격 증명을 사용하여 웹 서비스에 연결하려고 할 때, 나는 연결하고 서비스 XML을 볼 수 있어요.

내가 잘못하고 있거나 IIS 쪽 (IIS 7.5)에서 잘못된 것이 있는지 확실하지 않습니다. 서비스에 대해 익명 인증이 사용되며 IIS에서 나머지는 사용할 수 없습니다.

다른 SO 질문에서 해결책을 얻을 수 없습니다. 그러나 그것은 가능한 중복 될 수 있습니다. 이 경우 링크를 제공하십시오.

감사합니다.

+0

왜 당신이 당신의 서비스를 소비하는 채널 팩터를 사용하지 마십시오 : 아래

은 나를 위해 일한 코드입니다? webHttpBinding 엔드 포인트가 있습니까? – Alex

+0

ChannelFactory를 사용하고 싶지 않은 이유는 서비스를 사용하고 싶지 않기 때문입니다. 난 그냥 사용자가 입력 한 새 서버 이름과 가상 디렉터리가 올바른지 확인하고 연결을 설정할 수 있는지 확인합니다. 나는 많은 일을하고 싶지 않고, 단지 연결을 설정하고 닫습니다. –

답변

1

나는이 문제와 해결책을 찾아 냈다. 서비스가 내가 제공하지 않는 "Authorization"커스텀 헤더를 기대하고 있다는 사실을 깨닫지 못했습니다. 내 잘못이야.

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