1

セルフホスト WCF REST サービスに問題があります。

ブラウザーまたは Fiddler を介して GET を発行しようとすると、400 Bad Request が返されます。トレースは、XmlException の内部例外「メッセージの本文が空であるため、読み取れません」を報告しています。

app.config に構成がありません (必要ですか?)。WebServiceHost を ServiceHost に変更しようとしましたが、WSDL が返されますが、操作はまだ 400 を返します。

ここで何が欠けていますか?

// Add Reference to System.ServiceModel and System.ServiceModel.Web
using System;
using System.Diagnostics;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.ServiceModel.Web;

namespace WCFRESTTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var baseAddress = new Uri("http://localhost:8000/");
            var host = new WebServiceHost(typeof(RestService), baseAddress);

            try
            {
                host.AddServiceEndpoint(typeof(IRestService), new WSHttpBinding(), "RestService");

                var smb = new ServiceMetadataBehavior();
                smb.HttpGetEnabled = true;
                host.Description.Behaviors.Add(smb);

                host.Open();
                Console.WriteLine("Service Running.  Press any key to stop.");
                Console.ReadKey();
            }
            catch(CommunicationException ce)
            {
                host.Abort();
                throw;
            }
        }
    }

    [ServiceContract]
    public interface IRestService
    {
        [OperationContract]
        [WebGet(UriTemplate = "Test")]
        bool Test();
    }

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
    public class RestService : IRestService
    {
        public bool Test()
        {
            Debug.WriteLine("Test Called.");
            return true;
        }
    }
}
4

1 に答える 1

4

を使用する場合WebServiceHost、通常、サービス エンドポイントを追加する必要はありません。「Web HTTP」(別名 REST) エンドポイント (つまり、SOAP を使用せず、 Fiddler などのツールで簡単に使用できますが、これが必要なようです)。また、Web HTTP エンドポイントは WSDLで公開されないため、どちらも追加する必要はありませんServiceMetadataBehavior

なぜそれが機能しないのか - GET リクエストを送信することは機能するhttp://localhost:8000/Testはずです - そして以下のコードでは機能します。このコードを実行し、以前に Fiddler で送信していたリクエストを送信して、違いを確認してください。それはあなたが抱えている問題を指摘するはずです。

public class StackOverflow_15705744
{
    [ServiceContract]
    public interface IRestService
    {
        [OperationContract]
        [WebGet(UriTemplate = "Test")]
        bool Test();
    }

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
    public class RestService : IRestService
    {
        public bool Test()
        {
            Debug.WriteLine("Test Called.");
            return true;
        }
    }

    public static void Test()
    {
        var baseAddress = new Uri("http://localhost:8000/");
        var host = new WebServiceHost(typeof(RestService), baseAddress);

        // host.AddServiceEndpoint(typeof(IRestService), new WSHttpBinding(), "RestService");

        // var smb = new ServiceMetadataBehavior();
        // smb.HttpGetEnabled = true;
        // host.Description.Behaviors.Add(smb);

        host.Open();

        WebClient c = new WebClient();
        Console.WriteLine(c.DownloadString(baseAddress.ToString().TrimEnd('/') + "/Test"));

        Console.WriteLine("Service Running.  Press any key to stop.");
        Console.ReadKey();
    }
}
于 2013-03-29T15:27:56.403 に答える