1

先月、サービス スタックで間違った REST サービスが呼び出されるという奇妙な動作に気付きました。

すべてが機能しているように見えますが、新しい REST サービスを追加すると、機能している REST サービスが正しく機能していません (つまり、間違った REST サービスが呼び出されます)。

問題が発生している理由を説明できるサービスのデータ契約をどのように持っているかを説明します。

私は最初に持っていました:

[DataContract(Name = "MyService", Namespace = "")]
[RestService("/api/v1/dvbs/{ServiceName}", "GET", "application/xml")]
public class GetServiceDto
{
    [DataMember(Name = "SessionId", Order = 1)]
    public string SessionId { get; set; }
    [DataMember(Name = "UserName", Order = 2)]
    public string UserName { get; set; }
    [DataMember(Name = "ServiceName", Order = 3)]
    public string ServiceName { get; set; }
}

そして、すべての呼び出しで同じデータ (セッション ID、ユーザー名、およびサービス名) を渡していたので、新しいサービスは次のように開始されました。

[DataContract(Name = "MyService", Namespace = "")]
[RestService("/api/v1/dvbs/{ServiceName}/tuners", "GET", "application/xml")]
public class GetTunersDto : GetServiceDto
{
}

前述したように、これはすべて正常に機能しましたが、新しいサービスを追加したときに「api/v1/dvbs/{ServiceName}」を呼び出すと、サービス「api/v2/dvbs/{ServiceName}/tuners」が呼び出されます。

継承された関係を削除して、次のようにしました。

[DataContract(Name = "MyService", Namespace = "")]
[RestService("/api/v1/dvbs/{ServiceName}/tuners", "GET", "application/xml")]
public class GetDvbConfigTunersDto
{
    [DataMember(Name = "SessionId", Order = 1)]
    public string SessionId { get; set; }
    [DataMember(Name = "UserName", Order = 2)]
    public string UserName { get; set; }
    [DataMember(Name = "ServiceName", Order = 3)]
    public string ServiceName { get; set;}
}

そして今はうまくいきます。

奇妙なことに、それは正常に機能していましたが、後日新しいサービスを追加したときにのみ、間違ったマッピングが発生しました。

何か案は?

4

1 に答える 1

3

サービスごとに 1 つのリクエスト DTO しか持つことができず、リクエスト DTO を継承すると属性ルートが継承されるため、 GetTunersDtoはGetServiceDtoと同じルートを継承し、競合するあいまいなルートを ServiceStack に設定します。

解決策は、DTO (特に要求 DTO) で継承を使用しないことです。

于 2012-05-22T19:56:33.070 に答える