2

私はサービススタックに不慣れで、何時間も苦労してサービススタックを機能させようとしています。今のところ、主要なショー ストッパーは、例外部分を機能させることができないことです。私はすべてのプラグインを本で登録し、サービスは REST、Soap、CSV、XML、JSV の両方で動作します。このプロジェクトには、顧客オブジェクトに対する crud 操作の 4 つの基本的なテスト メソッドが含まれています。エラーがスローされたときに、予想されるエラーが発生しません。ResponseStatus が設定されておらず、一般的なエラーが生成されます。誰かが理由を見つけるのを手伝ってもらえますか?

https://dl.dropbox.com/u/101619220/TestingServiceStack.zip

編集:コメントありがとうございます:)

簡単な AppHost ファイルを作成しました。

名前空間 TestingServiceStack { public class AppHost : AppHostBase { public AppHost() : base("StarterTemplate ASP.NET Host", typeof(CustomersService).Assembly) { }

    public override void Configure(Container container)
    {
        Plugins.Add(new ValidationFeature());
        Plugins.Add(new RequestLogsFeature());

        SetConfig(new EndpointHostConfig
            {
                DebugMode = true, //Enable StackTraces in development
            });

        LogManager.LogFactory = new Log4NetFactory(true);

        JsConfig.EmitCamelCaseNames = true;
        JsConfig.DateHandler = JsonDateHandler.ISO8601;

        Routes.Add<GetCustomers>("/customers", "GET")
              .Add<GetCustomers>("/customers/{Id}", "GET")
              .Add<AddCustomer>("/customers", "POST")
              .Add<UpdateCustomer>("/customers/{Id}", "PUT")
              .Add<DeleteCustomer>("/customers/{Id}", "DELETE");
    }

    public static void Start()
    {
        new AppHost().Init();
    }
}

}

そしてサービス:

名前空間 TestingServiceStack { public class CustomersService : Service { #region Logging

    private static readonly ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

    #endregion

    public object Any(GetCustomers request)
    {
        GetCustomersResponse response = null;
        try
        {
            if (request.Id != "0")
                throw HttpError.NotFound("Id {0} throws error".Fmt(request.Id));

            response = new GetCustomersResponse {Id = request.Id ?? "notset", Name = "GetCustomers"};
        }
        catch (Exception ex)
        {
            Log.Error(base.RequestContext.Get<IHttpRequest>(), ex);
            throw;
        }

        return response;
    }

    public object Any(AddCustomer request)
    {
        return new AddCustomerResponse {Id = request.Id, Name = "AddCustomer"};
    }

    public object Any(UpdateCustomer request)
    {
        return new UpdateCustomerResponse {Id = request.Id, Name = request.Name};
    }

    public object Any(DeleteCustomer request)
    {
        return new DeleteCustomerResponse {Id = request.Id, Name = "DeleteCustomer"};
    }
}

}

交換されるオブジェクトは次のとおりです。

System.Runtime.Serialization の使用; ServiceStack.ServiceInterface.ServiceModel の使用;

名前空間 TestingServiceStack { [DataContract] public class GetCustomers { [DataMember] public string Id { get; 設定; } }

[DataContract]
public class UpdateCustomer
{
    [DataMember]
    public string Id { get; set; }

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

[DataContract]
public class AddCustomer
{
    [DataMember]
    public string Id { get; set; }

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

[DataContract]
public class DeleteCustomer
{
    [DataMember]
    public string Id { get; set; }
}

[DataContract]
public class GetCustomersResponse : IHasResponseStatus
{
    [DataMember]
    public string Id { get; set; }

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

    [DataMember]
    public ResponseStatus ResponseStatus { get; set; }
}

[DataContract]
public class UpdateCustomerResponse : IHasResponseStatus
{
    [DataMember]
    public string Id { get; set; }

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

    [DataMember]
    public ResponseStatus ResponseStatus { get; set; }
}

[DataContract]
public class AddCustomerResponse : IHasResponseStatus
{
    [DataMember]
    public string Id { get; set; }

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

    [DataMember]
    public ResponseStatus ResponseStatus { get; set; }
}

[DataContract]
public class DeleteCustomerResponse : IHasResponseStatus
{
    [DataMember]
    public string Id { get; set; }

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

    [DataMember]
    public ResponseStatus ResponseStatus { get; set; }
}

}

SoapUi を使用して、id が 0 の場合にエラーをスローするメソッド GetCustomers を呼び出します。ResponseStatus が設定されることを期待しますが、そうではありません。SoapUi から呼び出すと、次のエラーが発生します。

応答ステータスを適切に設定する方法がわかりません。ヒントをいただければ幸いです。

4

3 に答える 3

2

私はすべてのプラグインを本で登録し、サービスは REST、Soap、CSV、XML、および JSV の両方で機能します。 @mythz をエコーするために、エラーや例外の例で明確に述べられた問題で直接の質問に答える方がはるかに簡単です。上記のようなステートメント/一般化に関する私の問題は、「本による」が何を意味するのか、または作業の概念が何であるかがわからないことです(ビルドが成功した、メタデータページが表示されたなど)

ResponseStatus が設定されておらず、一般的なエラーが生成されます。

CustomersService クラスでは、エラー (HttpError) をスローし、それをキャッチ/ログしているように見えます。その後、コードは null 応答を返します。ServiceStack は、例外のスローをネイティブでサポートしています。に追加するthrowcatch(ロギング目的でキャッチを保持する場合)、入力された ResponseStatus を取得する必要があります。

        GetCustomersResponse response = null;
        try
        {
            if (request.Id != "0")
                throw HttpError.NotFound("Id {0} throws error".Fmt(request.Id));

            response = new GetCustomersResponse {Id = request.Id ?? "notset", Name = "GetCustomers"};
        }
        catch (Exception ex)
        {
            Log.Error(base.RequestContext.Get<IHttpRequest>(), ex);
            throw; //Let ServiceStack do its thing.
        }

        return response;

SoapUI

この変更により、soapUI の問題が修正される可能性がありますが、どのような「一般的なエラー」が発生しているのかは不明です。この問題は、null 応答の「逆シリアル化」が原因である可能性があると推測しています。

于 2013-04-03T04:23:25.197 に答える
1

ServiceStack は、サード パーティの SOAP ライブラリまたはクライアント プロキシを使用したトラブルシューティングをサポートしていません。

統合テストの例外の例については、 WebServicesTests.csを参照してください。SOAP については、ServiceStack の SOAP サポートとその制限についても調べてください。

于 2013-04-02T21:30:03.077 に答える