2012-08-02 5 views
2

Visual Studio 2010에서 WCF를 사용하여 공급 업체의 웹 서비스에 대한 클라이언트를 작성하고 있습니다. 구현 또는 구성을 변경할 수 없습니다.WCF를 통한 타사 보안 웹 서비스 호출 - 인증 문제

테스트 서버의 설치에 대해 실행해도 아무런 문제가 없었습니다. 나는 그들의 WSDL에서 서비스 참조를 추가 코드에서 URL을 설정하고 호출했다 :

var client = new TheirWebservicePortTypeClient(); 
client.Endpoint.Address = new System.ServiceModel.EndpointAddress(webServiceUrl); 

if (webServiceUsername != "") 
{ 
    client.ClientCredentials.UserName.UserName = webServiceUsername; 
    client.ClientCredentials.UserName.Password = webServicePassword; 
} 

TheirWebserviceResponse response = client.TheirOperation(myRequest); 

단순하고 간단합니다. 사용자가 프로덕션 서버로 이동하고 https를 사용하도록 구성해야합니다. 그 때 나는이 오류가 발생했습니다 :

The HTTP request is unauthorized with client authentication scheme 'Anonymous'. The authentication header received from the server was 'Basic realm='. 

그래서 나는 도움을 찾고 갔다. 나는 이것을 발견했다 : Can not call web service with basic authentication using wcf.

승인 된 대답은 제안이 : 또한 아주 간단 보였다

BasicHttpBinding binding = new BasicHttpBinding(); 

binding.SendTimeout = TimeSpan.FromSeconds(25); 

binding.Security.Mode = BasicHttpSecurityMode.Transport; 
binding.Security.Transport.ClientCredentialType = 
           HttpClientCredentialType.Basic; 

EndpointAddress address = new EndpointAddress(your-url-here); 

ChannelFactory<MyService> factory = 
      new ChannelFactory<MyService>(binding, address); 

MyService proxy = factory.CreateChannel(); 

proxy.ClientCredentials.UserName.UserName = "username"; 
proxy.ClientCredentials.UserName.Password = "password"; 

. 위의 "MyService"대신에 사용해야하는 서비스 참조를 만들기 위해 wsdl에서 생성 된 클래스 및 인터페이스 중 다수를 알아 내려고 노력했습니다.

내 첫 번째 시도는 "TheirWebservicePortTypeClient"(이전 버전에서 인스턴스화 한 클래스)를 사용하는 것이 었습니다. 그게 내 런타임 오류를 준 :

The type argument passed to the generic ChannelFactory class must be an interface type. 

그래서 생성 된 코드를 좀 더 파고.

public partial class TheirWebservicePortTypeClient 
: 
    System.ServiceModel.ClientBase<TheirWebservicePortType>, 
    TheirWebservicePortType 
{ 
    ... 
} 

그래서 내가 TheirWebservicePortType으로> ChannelFactory에 <의 인스턴스를 시도 :이를 보았다.

이렇게하면 컴파일 타임 오류가 발생합니다. 결과 프록시에는 ClientCredentials 멤버 또는 TheirOperation() 메서드가 없습니다.

그래서 "System.ServiceModel.ClientBase"를 시도했습니다.

인스턴스화 채널 팩토리 <> 여전히 컴파일 타임 오류가 발생했습니다. 결과 프록시에는 ClientCredentials 멤버가 있지만 여전히 TheirOperation() 메서드가 없습니다.

그래서 무엇을 제공합니까? WCF 클라이언트의 HTTPS 웹 서비스에 사용자 이름/암호를 어떻게 전달합니까?

================== 해결책을 설명하기 위해 편집 됨 ==================

먼저 제안 된대로 TheirWebservicePortType으로 팩토리를 인스턴스화하고 factory.Credentials에 사용자 이름과 암호를 추가하십시오. 대신 proxy.ClientCredentials가 정상적으로 작동합니다. 1 비트의 혼란을 제외하고.

은 아마는 WSDL이 기록되는 이상한 방법으로 할 일이지만, 클라이언트 클래스, TheirWebservicePortTypeClient는 요청 인수를 복용하고 응답 결과를 반환으로 TheirOperation을 정의했다. TheirWebservicePortType 인터페이스는 TheirOperation_Input 인수를 가져오고 TheirOperation_Output에 Responsible 멤버가 들어있는 TheirOperation_Input 인수가있는 TheirOperation_Input 인수를 가져오고 TheirOperation_Output 결과를 반환하는 것으로 TheirOperation을 정의했습니다.내가 전달 된 요청에서 TheirOperation_Input 객체를 구축하면 어떤 경우

는 프록시에 대한 호출이 성공하고 난 후 반환 TheirOperation_Output 개체에서 포함 된 응답 객체를 추출 할 수있다 :

TheirOperation_Output output = client.TheirOperation(new TheirOperation_Input(request)); 
TheirWebserviceResponse response = output.TheirWebserviceResponse; 

답변

1

추가를 ChannelFactory Credentials 속성의 자격 증명

+0

그리고 ChannelFactory <>를 사용하여 어떤 클래스 또는 인터페이스를 인스턴스화합니까? 결과 프록시가 작동합니까? –

+0

당신이 'TheirWebservicePortType'을 사용했다고 설명했던 것부터 –