2012-03-24 3 views
0

두 가지 조작 만있는 MiniCalc라는 기본 계산기 서비스를 만들었습니다. Add 및 Mul을 실행하고 콘솔 응용 프로그램에서 호스팅합니다. "서비스 참조 추가"로 자체 호스팅 서비스의 프록시를 생성 할 수 없습니다

using(ServiceHost host = new ServiceHost(typeof(MiniCalcService.Service), 
             new Uri("http://localhost:8091/MiniCalcService"))) 
{ 
    host.AddServiceEndpoint(typeof(MiniCalcService.IService), 
          new BasicHttpBinding(), 
          "Service"); 
    host.Open(); 
    Console.Write("Press ENTER key to terminate the MiniCalcHost . . . "); 
} 

는 다음 나는 서비스를 사용하는 콘솔 응용 프로그램을 작성 프록시 클래스를 생성하여 수동으로 프록시를 생성 한 후 서비스를 호출하는 ChannelFactory에를 만들었습니다.
EndpointAddress ep = new EndpointAddress("http://localhost:8091/MiniCalcService/Service"); 
IService proxy = ChannelFactory<IService>.CreateChannel(new BasicHttpBinding(),ep); 

내가 제대로 서비스 계약을 호출하고 예상대로 결과를 검색 할 수 있었다.

이제 Add Service Reference을 사용하여 프록시를 만들고 싶습니다. 내가 추가 서비스 참조 창 I가 없거나 잘못을하고있는 중이 야 무엇

There was an error downloading 'http://localhost:8091/MiniCalcService/Service'. 
The request failed with HTTP status 400: Bad Request. 
Metadata contains a reference that cannot be resolved: 'http://localhost:8091/MiniCalcService/Service'. 
Content Type application/soap+xml; charset=utf-8 was not supported by service http://localhost:8091/MiniCalcService/Service. The client and service bindings may be mismatched. 
The remote server returned an error: (415) Cannot process the message because the content type 'application/soap+xml; charset=utf-8' was not the expected type 'text/xml; charset=utf-8'.. 
If the service is defined in the current solution, try building the solution and adding the service reference again. 

에서 이동을 클릭하면

나는 다음과 같은 오류가?

+0

그것은 당신의 서비스가에 대한 정보를 제공하지에 대한 몇 가지 사용하는 방법의 예를 또는 무언가를 보여줍니다? –

+0

.svc 파일이 없습니다. Service.cs 및 해당 IService.cs 만 만들었습니다. 내 무지하게 신경 쓰지 마시고 .svc 파일이 필요합니다. 우리는 도구를 사용하여 프록시를 생성하고 서비스를 사용하고 싶습니까? – Animesh

+0

한 번도 물어 보지 않은 경우 무식함입니다. 아무도 모든 것을 알지 못합니다. 어떤 점에서는 0부터 시작해야합니다. 내 대답을 보라. –

답변

3

ServiceHost에서 메타 데이터 교환 동작을 활성화하십시오.

using(ServiceHost host = new ServiceHost(typeof(MiniCalcService.Service), 
          new Uri("http://localhost:8091/MiniCalcService"))) 
{ 
    host.AddServiceEndpoint(typeof(MiniCalcService.IService), 
          new BasicHttpBinding(), 
          "Service"); 

    //Enable metadata exchange 
    ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); 
    smb.HttpGetEnabled = true; 
    host.Description.Behaviors.Add(smb); 

    host.Open(); 
    Console.Write("Press ENTER key to terminate the MiniCalcHost . . . "); 
} 

http://wcftutorial.net/WCF-Self-Hosting.aspx

+0

minmin, 위의 줄을 추가하여 메타 데이터 교환을 활성화했지만 서비스 참조 추가를 시도 할 때도 동일한 오류가 발생합니다. – Animesh

+0

minmin, 당신의 대답은 나를 위해 일했습니다. 내 실수는 끝점과 주소가 같다고 생각했습니다. 따라서 URL : http : // localhost : 8091/MiniCalcService/Service'는 끝점이며 원래의 게시물과 URL에 설명 된대로 수동 프록시에서 사용해야합니다. 'http : // localhost : 8091/MiniCalcService'는 주소가 있어야하며 서비스 참조 추가 창에서 사용해야합니다. – Animesh

1

당신은 당신이 서비스의 .config이 있어야합니다 생각 SVC는 없기 때문에 : 당신은 서비스 메타 데이터를 허용하는 옵션이 필요합니다 그 후

<serviceHostingEnvironment multipleSiteBindingsEnabled="true"> 
     <serviceActivations> 
      <add relativeAddress="Service.svc" service="MiniCalcService.Service" /> 
     </serviceActivations> 
    </serviceHostingEnvironment> 

을 :

<serviceMetadata httpGetEnabled="true" /> 

이것은 좀 더 복잡하므로 새로운 WCF S를 만들 것을 권장합니다. 새로운 솔루션을 도입하면이 구성의 모습을 볼 수 있습니다. 따라서 복사/붙여 넣기 구성 만하면됩니다. 를 가리키는 후

: 당신은 브라우저에서 SVC는 액세스 할 때

http://localhost:8091/MiniCalcService/Service.svc

+0

Vitor, 위의 코드를 구성 대신 구현할 수 있습니까? 아직 app.config 파일이 없기 때문에이 질문을합니다. – Animesh

+0

파일 -> 추가 -> 응용 프로그램 구성 파일을 쉽게 가리키는 app.config를 추가 할 수 있습니다. 구성을 원하지 않는다면 @minmin과 같은 aproach를 사용하여이 작업을 수행 할 수 있다고 생각합니다. –

+0

저는 이제 minmin 코드를 사용하여 원하는 것을 얻었습니다.나는 그의 대답 아래에 설명을 올렸다. 도와 주셔서 감사합니다. – Animesh