3

WCF REST スターター キットを使い始めたところです。

オブジェクトの配列を返す単純なサービスを作成しました。

ブラウザーを使用するとすべて正常に動作しますが、WCF クライアントを使用すると ArgumentException が発生します。

私はIISを使用していません。コードは次のとおりです。

その契約:

[ServiceContract]
    public interface IGiftService {

        [WebGet(UriTemplate="gifts")]
        [OperationContract]
        List<Gift> GetGifts();

    }

    public class GiftService : IGiftService {

        public List<Gift> GetGifts() {
            return new List<Gift>() {
                new Gift() { Name = "1", Price = 1.0 },
                new Gift() { Name = "2", Price = 1.0 },
                new Gift() { Name = "3", Price = 1.0 }
            };
        }

    }

    [DataContract]
    public class Gift {

        [DataMember]
        public string Name { get; set; }
        [DataMember]        
        public double Price { get; set; }
    }

サービスを開始するには:

WebServiceHost2 host = new WebServiceHost2(
                typeof(GiftService), 
                true, 
                new Uri("http://localhost:8099/tserverservice"));
            host.Open();

            Console.WriteLine("Running");
            Console.ReadLine();
            host.Close();

クライアントを起動するには:

WebChannelFactory<IGiftService> factory = new WebChannelFactory<IGiftService>(
                new Uri("http://localhost:8099/tserverservice"));

            IGiftService service = factory.CreateChannel();
            List<Gift> list = service.GetGifts();

            Console.WriteLine("-> " + list.Count);
            foreach (var item in list) {
                Console.WriteLine("-> " + item.Name);
            }

サーバーとクライアントは同じソリューションにあり、両方で同じインターフェイスを使用しています (サービス コントラクトを説明するため)。

例外は、「'UriTemplateMatchResults' という名前のプロパティは既に存在します。」そしてそれはスタックトレースです:

例外を発生させるクラス-> Microsoft.ServiceModel.Web.WrappedOperationSelector

スタックトレース:

  at System.ServiceModel.Channels.MessageProperties.UpdateProperty(String name, Object value, Boolean mustNotExist)
   at System.ServiceModel.Channels.MessageProperties.Add(String name, Object property)
   at System.ServiceModel.Dispatcher.WebHttpDispatchOperationSelector.SelectOperation(Message& message, Boolean& uriMatched)
   at System.ServiceModel.Dispatcher.WebHttpDispatchOperationSelector.SelectOperation(Message& message)
   at Microsoft.ServiceModel.Web.WrappedOperationSelector.SelectOperation(Message& message) in C:\Program Files\WCF REST Starter Kit\Microsoft.ServiceModel.Web\WrappedOperationSelector.cs:line 42
   at Microsoft.VisualStudio.Diagnostics.ServiceModelSink.ServiceMethodResolver.GetOperation()
   at Microsoft.VisualStudio.Diagnostics.ServiceModelSink.ServiceMethodResolver..ctor(ContractDescription contract, DispatchRuntime runtime, Message request, InstanceContext instanceContext)

私は何を間違っていますか?

更新:ヘルプ ページを無効にしましたが、サービスは現在機能しています。バグですか?

host.EnableAutomaticHelpPage = false;

ありがとうございました!

アンドレ・カルッチ

4

3 に答える 3

1

私も同じ問題を抱えていましたが、ヘルプページを見たかったので、それを無効にすることは私にとって解決策ではありませんでした. WCF REST Toolkit の URITemplating がこれらの問題を引き起こしていることがわかりました。テンプレート テーブルにこのテンプレートが既にあることがわかりました。基本的に、メソッドへの URL が要求されたデータに応じて異なる場合にのみテンプレートが必要になります。結局のところ、それがテンプレートの目的です。POST 操作に同じ URITemplates を使用していたため、このエラーの原因となった個別のクエリ間で URL が異なっていませんでした。その後、少なくとも POST 操作については、実際にはテンプレートをまったく必要としないことがわかりました。さらに、メソッドで複雑なオブジェクトをパラメーターとして渡す必要がある場合、URL を介して POST クエリを作成することはできません。そこで、サービス インターフェイスの WebInvoke 属性から URITemplate という名前のパラメーターを削除しました。これで問題は解決したと思います。もちろん、サーバーに対して GET クエリを実行し、URITemplating に依存している場合でも、ヘルプ ページを我慢するか、放置する必要があります。

于 2010-05-14T13:54:19.223 に答える
1

同じ問題があり、ヘルプページを無効にして修正しました。一部の REST URL が連続して非常に迅速に呼び出されると、例外がスローされていました。電話の合間に待っていても大丈夫でした。

protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
        {
            return new WebServiceHost2(serviceType, true, baseAddresses) {EnableAutomaticHelpPage = false};
        }
于 2009-02-02T11:30:52.977 に答える