2011-09-23 7 views
6

많은 게시물 (예 : This one seems popular)을 읽었음에도 불구하고 SOAP 및 REST 프로토콜과 호환되는 여러 끝점으로 서비스를 제공 할 수 없습니다.WCF REST 및 WebServiceHostFactory가없는 SOAP 서비스

Factory="System.ServiceModel.Activation.WebServiceHostFactory" 

요소는 서비스 코드 숨김 페이지에 있습니다.

나가면 SOAP 엔드 포인트가 작동하지만 JSON 엔드 포인트를 찾을 수 없습니다. 줄을 넣으면 내 REST 끝점은 bird처럼 나타나고 SOAP 끝점은 Service.svc 페이지에서 "끝점을 찾을 수 없음"의 결과입니다.

[OperationContract] 
    [WebGet(UriTemplate = "/GetData", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)] 
    string GetData(); 

그리고 구성 파일

<endpoint address="rest" binding="webHttpBinding" contract=".IMeterService" behaviorConfiguration="REST" /> 

<endpoint address="soap" binding="wsHttpBinding" contract="IMeterService" bindingConfiguration="secureBasic" /> 

<behavior name="REST"> 
     <webHttp /> 
</behavior> 

어떻게 이것을 달성 할 수

내 작업은 표준 방법의 예에서 설정을 나타 납니까? System.ServiceModel.Activation.WebServiceHostFactory 속성없이 REST 끝점 을 설정하는 방법이 있습니까?

미리 감사드립니다. 당신은 SVC는 파일에서 공장을 지정하지 않으면

+0

http : //www.c-sharpcorner.com/uploadfile/dhananjaycoder/windows-authentication-on-rest-enabled-wcf-service/ – MaxRecursion

답변

5

, 모든 엔드 포인트가 web.config 파일에서 올 것이다 - WCF가 되었더라도 <system.serviceModel/service> 요소 name 속성은 완전한 이름의 일치를 찾기 위해 노력할 것입니다 서비스 클래스. 찾지 못하면 기본 끝점을 추가합니다 (기본 매핑을 변경하지 않은 경우 basicHttpBinding 사용). 그게 당신이 직면 한 것처럼 보입니다. <service> 요소의 "name"속성이 .svc 파일의 Service 속성 값과 일치하는지 확인하고 두 종점이 잘 작동하도록해야합니다.

시도해 볼 수있는 또 다른 사항은 서비스에서 실제로 어떤 종단점이 열렸는 지 확인하기 위해 서비스 (수준 = 정보)에서 추적을 사용하도록 설정하는 것입니다. 아래의 화상 : Service.svc 공장 지정한하지 않습니다

namespace MyNamespace 
{ 
    [ServiceContract] 
    public interface ITest 
    { 
     [OperationContract] 
     string Echo(string text); 
    } 
    public class Service : ITest 
    { 
     public string Echo(string text) 
     { 
      return text; 
     } 
    } 
} 

:

<% @ServiceHost Service="MyNamespace.Service" Language="C#" debug="true" %> 

그리고 웹

SvcTraceViewer image

이 예를 들어 서버가 주요 아무것도 아니다 .config는 추적에 표시되는 두 개의 끝점을 정의합니다.

<configuration> 
    <system.diagnostics> 
     <sources> 
      <source name="System.ServiceModel" switchValue="Information, ActivityTracing" 
       propagateActivity="true"> 
       <listeners> 
        <add type="System.Diagnostics.DefaultTraceListener" name="Default"> 
         <filter type="" /> 
        </add> 
        <add name="ServiceModelTraceListener"> 
         <filter type="" /> 
        </add> 
       </listeners> 
      </source> 
     </sources> 
     <sharedListeners> 
      <add initializeData="C:\temp\web_tracelog.svclog" type="System.Diagnostics.XmlWriterTraceListener, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
       name="ServiceModelTraceListener" traceOutputOptions="Timestamp"> 
       <filter type="" /> 
      </add> 
     </sharedListeners> 
     <trace autoflush="true"/> 
    </system.diagnostics> 
    <system.serviceModel> 
     <behaviors> 
      <endpointBehaviors> 
       <behavior name="Web"> 
        <webHttp /> 
       </behavior> 
      </endpointBehaviors> 
     </behaviors> 
     <services> 
      <service name="MyNamespace.Service"> 
       <endpoint address="basic" binding="basicHttpBinding" bindingConfiguration="" 
        name="basic" contract="MyNamespace.ITest" /> 
       <endpoint address="web" behaviorConfiguration="Web" binding="webHttpBinding" 
        bindingConfiguration="" name="web" contract="MyNamespace.ITest" /> 
      </service> 
     </services> 
    </system.serviceModel> 
</configuration> 

리스너에 표시된 추가 리스너가 있음을 알 수 있습니다.이 서비스는 WCF의 "도움말 페이지"(사용자가 서비스를 탐색 할 때 메타 데이터를 사용할 수 없음을 알려주는 페이지)입니다.

이 설정을 나와 비교해 보거나이 간단한 것으로 시작한 다음 문제가 발생할 때까지 구성 요소를 추가 할 수 있습니다. 그러면 문제를 격리하는 데 도움이됩니다.

행운을 빈다.

+0

찾아 주셔서 감사합니다. 예를 들어 config 파일 name = "MeterService"에 지정된 서비스 이름이 MeterService의 "name"과 일치합니다. svc 파일 (예 : Service = "MeterService"). 내 엔드 포인트 또는 서비스 구성과 관련이 있어야합니다. 무엇이 확실하지 않습니다. – Simian

+0

간단한 예제로 답변을 업데이트했습니다. 당신은 당신의 것과 다른 것이 있는지보기 위해 그것을 들여다 볼 수 있습니다. – carlosfigueira