私はサービススタックに不慣れで、何時間も苦労してサービススタックを機能させようとしています。今のところ、主要なショー ストッパーは、例外部分を機能させることができないことです。私はすべてのプラグインを本で登録し、サービスは 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 から呼び出すと、次のエラーが発生します。
応答ステータスを適切に設定する方法がわかりません。ヒントをいただければ幸いです。