0

私の単純なサンプル wcf サービスは機能していましたが、突然、「WCF テスト クライアント」ダイアログでエンドポイント アドレスの入力を求められ始めました。

F5を押したときにブラウザ(IE 8)がポップアップして、この「WCFテストクライアント」が表示されるようになる原因を変更したことを思い出せません。

提供された編集ボックスに何を入力すればよいかわからなかったので、「http://localhost:4841/RestServiceImpl.svc」を試してみました (http://localhost:4841/RestServiceImpl.svc/xml/123 は引き続き動作しますVisual Studio の外部)

(ダイアログのタスクバーに「サービスが正常に追加されました」と表示されます) それを受け入れましたが、他には何もしません。「My Service Projects」ツリービューをクリックしても何も起こりません (子がありません)。

アップデート

新しい操作を IE8 から直接実行しようとすると、次のようになります。

「/」アプリケーションでサーバー エラーが発生しました。

コントラクト 'IRestServiceImpl' には、メソッド 'GET' と 'xml/{platypusId}' に相当する UriTemplate を使用した複数の操作があります。メッセージを明確にディスパッチするには、各操作で UriTemplate と Method の一意の組み合わせが必要です。WebGetAttribute または WebInvokeAttribute を使用して、操作の UriTemplate および Method 値を変更します。

これは、文字列を受け取る xml を返す操作を 1 つしか持てないということですか? 他の/元の方法は ...xml/{id}...

更新 2

これはコードであり、まだ失敗しています:

[ServiceContract]
public interface IRestServiceImpl
{
    [OperationContract(Name="Foo")]
    [WebInvoke(Method = "GET",
        ResponseFormat = WebMessageFormat.Xml,
        BodyStyle = WebMessageBodyStyle.Wrapped,
        UriTemplate = "xml/{id}")]
    string XMLData(string id);

    [OperationContract(Name="FooBar")]
    [WebInvoke(Method = "GET",
        ResponseFormat = WebMessageFormat.Xml,
        BodyStyle = WebMessageBodyStyle.Wrapped,
        UriTemplate = "xml/{platypusId, anotherId}")]
    string FirstTrial(string platypusId, string anotherId);

    [OperationContract(Name="FooFooBar")]
    [WebInvoke(Method = "GET",
        ResponseFormat = WebMessageFormat.Json,
        BodyStyle = WebMessageBodyStyle.Wrapped,
        UriTemplate = "json/{id}")]
    string JSONData(string id);
}

// 実装 (.svc) ファイル

public class RestServiceImpl : IRestServiceImpl
{
    public string XMLData(string id)
    {
        return "You requested product " + id;
    }

    public string FirstTrial(string platypusId, string anotherID)
    {
        return "I reckon so" + platypusId + anotherID;
    }

    public string JSONData(string id)
    {
        return "You requested product " + id;
    }
}
4

2 に答える 2

2

文字列を受け取り、XMLを返すメソッドを複数持つことはできますが、同じ名前を付けて両方をGETメソッドにすることはできません。あなたがどちらに電話をかけようとしているのかをどうやって知るのでしょうか?

于 2012-10-17T21:08:50.137 に答える
2

どのタイプの Web サービスでも、オーバーロードされたメソッドを持つことはできません。別の OperationContract Name EG を指定すると、WCF はこれを許可します。

[ServiceContract]
interface IService
{
    [OperationContract(Name="Foo")]
    void Foo();

    [OperationContract(Name="Foobar")]
    void Foo(string bar);

}

しかし、これは基本的に公開署名をメソッドに変更することであり、インターフェイスで同じ名前が付けられていても、クライアントを作成するときに混乱する可能性があるため、通常はこれを行いません。

更新しました:

web.config で autoformatselectionenabled が true になっていることを確認してください。

<endpointBehaviors>
    <behavior name="web">
        <webHttp automaticFormatSelectionEnabled="true"/>
    </behavior>
</endpointBehaviors>

「これにより、リクエスト タイプ (JSON/XML) ごとにレスポンス フォーマットが自動的に設定されます」

于 2012-10-17T21:12:43.037 に答える