0

自己ホスト型の WCF RESTful(Json) サーバーを構築しようとしています。ステップバイステップのチュートリアルに従ってくださいhttp://192.168.1.250:18688/MyService/GetJSON。フィドラーでのリクエスト後にエラー400が返されます。この場合、SVC ファイルの変更が必要だという人もいますが、実際にはセルフホステッド アプリにはそのようなファイルはありません。

修正方法は?ありがとうございました!

インターフェース

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

1 に答える 1

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()

于 2013-07-29T10:52:22.550 に答える