2013-07-29 2 views
0

자체 호스팅 WCF RESTful (Json) 서버를 구축하려고합니다. 단계별 자습서에 따라 단계별로 수행하면 피들러에서 http://192.168.1.250:18688/MyService/GetJSON 요청 후 오류 400이 반환됩니다. 이 경우 SVC 파일의 수정이 필요하지만 실제로는 자체 호스팅 된 응용 프로그램에는 이러한 파일이 없습니다.WCF REST 자체 호스팅 반환 400 잘못된 요청

문제를 해결하는 방법은 무엇입니까? 고맙습니다!

인터페이스

namespace Contracts 
{ 
    [ServiceContract] 
    public interface IMyService 
    { 
     [OperationContract] 
     [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, UriTemplate = "Ping")] 
     bool Ping(); 
     [OperationContract] 
     Dude GetDude(); 
     [OperationContract] 
     [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, UriTemplate = "GetJSON")]//,BodyStyle=WebMessageBodyStyle.Bare)] 
     string GetDudeJSON(); 
    } 
} 

코드

namespace Contracts 
{ 
    [ServiceBehavior] 
    public class MyService:IMyService 
    { 
     public Dude Dummy { get; set; } 
     public MyService() 
     { 
      Dummy = new Dude("Dude", 28); 
     } 


     public bool Ping() 
     { 
      return true; 
     } 

     public Dude GetDude() 
     { 
      return Dummy; 
     } 

     string IMyService.GetDudeJSON() 
     { 
      MemoryStream stream = new MemoryStream(); 
      DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Dude)); 
      ser.WriteObject(stream,Dummy); 
      stream.Position = 0; 
      StreamReader reader = new StreamReader(stream); 
      // Console.WriteLine("Read:"+reader.ReadToEnd()); 
      return reader.ReadToEnd(); 
     } 
    } 
} 

의 app.config

<?xml version="1.0"?> 
<configuration> 
    <system.serviceModel> 
    <services> 
     <service name="Contracts.MyService" behaviorConfiguration="MEXBehavior"> 
     <endpoint address="" binding="basicHttpBinding" bindingConfiguration="httpBinding1" contract="Contracts.IMyService"></endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"></endpoint> 
     <host> 
      <baseAddresses>   
      <add baseAddress="http://192.168.1.250:18688/MyService"/> 
      </baseAddresses> 
     </host> 
     </service> 
    </services> 
    <!-- A behavior definition for MEX --> 
    <behaviors> 
     <serviceBehaviors> 

     <behavior name="MEXBehavior"> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
      <serviceMetadata/> 
     </behavior>   
     </serviceBehaviors> 
    </behaviors> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="httpBinding1"></binding> 
     </basicHttpBinding>  
    </bindings> 
    </system.serviceModel> 

    <startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> 
    </startup> 
</configuration> 

CLI 호스트

static void Main(string[] args) 
     { 
      ServiceHost _host = new ServiceHost(typeof(Contracts.MyService)); 
      _host.Open();   
      ChannelFactory<Contracts.IMyService> channel = new ChannelFactory<Contracts.IMyService>(
                      new BasicHttpBinding(), 
                      new EndpointAddress("http://192.168.1.250:18688/MyService")); 
      Contracts.IMyService client = channel.CreateChannel(); 
      while (true) 
      { 
       ; 
      } 
     } 
+0

HTTP 요청 및 응답을 확인해야합니다. 응답자가 즉각적인 답을 제공하지 않으면 질문에 추가하십시오. –

답변

0

basicHttpBindingSOAP 기반 통신입니다. REST의 경우 webHttpBinding을 사용해야합니다.

이에 서비스 엔드 포인트를 변경

:

<endpoint address="" binding="webHttpBinding" contract="Contracts.IMyService" behaviorConfiguration="MyRestBehavior" /> 
당신은주의해야합니다

, 나는 엔드 포인트의 동작을 구성 참조를 추가했습니다. 당신의 <behaviors> 섹션에 정의 :

<endpointBehaviors> 
    <behavior name="MyRestBehavior"> 
     <webHttp /> 
    </behavior> 
</endpointBehaviors> 

당신이 수동으로 DataContractJsonSerializer를 사용할 필요가 없다 그렇게되면. 당신은 가지고 인터페이스를 변경할 수 있습니다

Dude GetDudeJSON(); 

및 구현에 :

Dude IMyService.GetDudeJSON() 
{ 
    return new Dude("Dude", 28); 
} 

당신은 자동으로 JSON 형식의 개체를 받게됩니다.

귀하의 while (true) { ; }은 정말 나쁜 방법입니다. CPU주기를 먹어 치울 것입니다. 대신 일부 차단 호출을 사용하십시오. Console.ReadLine()

+0

감사합니다! 그런 상세한 답변, 나는 이것을 시도하고 나중에 다시 피드. 그리고 또 다른 놀람인데, 분명히 잘못된 샘플이고 많은 CPU로드를 필요로했기 때문에 지금은 그것을 발견하고 정말로 감사하게 생각합니다. D – Alex

+0

WOW 작동! 다시 한번 감사드립니다! : D – Alex