0
// Service file

   [WebInvoke(UriTemplate = "Send/{country}", Method = "POST")]
    public int Send(IFoo item, string country)

// Interface file
    public interface IFoo
    {
        string firstMember { get; set; }
        string secondMember { get; set; }
    }

// Implementation file
public class FooImpl : IFoo
{
  string specificMember { get; set; }
}

http://example.com/MyService/Send/ {COUNTRY}/に投稿してRESTサービスを呼び出し
ます。次のようなtext/xmlパラメーターとしてIFoo実装を提供できるようにしたいです。

<FooImpl xmlns="http://schemas.datacontract.org/2004/07/Hello">
  <firstMember>Hello</firstMember>
  <secondMember>World</secondMember>
  <SpecificMember>!</SpecificMember>
</FooImpl>

Sendメソッド宣言でFooImpl型を宣言すると機能しますが、IFoo型を使用すると機能しません。(エラー400:不正な要求)
サービスヘルパーは次のように表示します:

<anyType xmlns:d1="http://www.w3.org/2001/XMLSchema" i:type="d1:schema" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2003/10/Serialization/" />

だから、それが私のパラメータのxmlの問題なのか、実装の問題なのかわかりません...

4

1 に答える 1

0

更新
さて、私の最初の仮定は間違っていたようです。既知の型が適切に設定されていても、あなたと同じエラーが発生します。どうやら、DataContractSerializer は既定では使用されず、動作を追加してカスタム シリアライザーを選択しても、REST エンドポイントには影響しません。もう少し掘り下げる必要があります...

元の投稿:
サービス コントラクトでインターフェイスを使用するのは少し複雑です。これは、最終的にデータを具象型に逆シリアル化する必要があるためです。インターフェイスはインスタンス化できません。

解決の鍵は、既知の型と呼ばれるものです。DataContractSerializer は、(逆) シリアル化中に実行される可能性のある具象型について知る必要があります。

4 つの異なるプロジェクトで構成される小さなサンプルを作成しました。ClientApp、インターフェイス、ライブラリ、およびサービス。

インターフェイスIFooにはとが含まれますIService

FooImplクライアントとサーバーの両方がこのタイプにアクセスする必要があるため、ライブラリには が含まれています。ただし、このライブラリは「プラグ可能」です。その場での実装をさらに追加できますIFoo

ServiceClientAppに含まれるものを推測してください:)

サービス コントラクトには、特別な KnownTypeAttribute が必要です。

[ServiceContract]
[ServiceKnownType(typeof(IFoo))]
public interface IService
{
    [OperationContract]
    string GetData(IFoo value);
}

これで、クライアントとサーバーの両方で App.config (またはそれが呼ばれるもの) で IFoo を実装する具象型を構成できます。

<system.runtime.serialization>
    <dataContractSerializer>
        <declaredTypes>
            <add type="Interface.IFoo, Interface">
                <knownType type="Library.FooImpl, Library" />
            </add>
        </declaredTypes>
    </dataContractSerializer>
</system.runtime.serialization>

このプラグ可能な構造が必要ない場合は、使用できるはずです

[KnownType(typeof(FooImpl))]

この精巧な構造全体の代わりに。

明日時間があれば、これで WCF REST をテストし、サンプルをどこかにダウンロードできるようにします。

于 2011-04-19T20:56:06.760 に答える