2

我是服务堆栈的新手,并且已经挣扎了几个小时,试图让服务堆栈为我工作。目前主要的表演障碍是我无法使异常部分起作用。我按本书注册了所有插件,服务适用于 REST、Soap、CSV、XML 和 JSV。该项目包含 4 种基本测试方法,用于对客户对象进行 crud 操作。抛出错误时,我没有得到预期的错误:未设置 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 { 公共类 CustomersService : 服务 { #region 日志记录

    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 调用 GetCustomers 方法,如果 id 等于 0,则会引发错误,我希望设置 ResponseStatus,但事实并非如此。从 SoapUi 调用时,出现以下错误:

我不知道如何正确设置 reponsestatus,任何提示都表示赞赏。

4

3 回答 3

2

我通过本书注册了所有插件,并且服务适用于 REST、Soap、CSV、XML 和 JSV 。为了回应 @mythz,通过错误或异常示例明确说明的问题来回答直接问题要容易得多。我对上述陈述/概括的问题是我不知道“按书本”是什么意思,也不知道您的工作概念是什么(可能构建成功,显示元数据页面等)

未设置 ResponseStatus 并生成一般错误。

在您的 CustomersService 类中,您似乎正在抛出错误 (HttpError) 并捕获/记录它。然后代码将继续返回空响应。ServiceStack 原生支持抛出异常。如果你添加一个throw到你的catch(假设你想保留捕获用于记录目的)你应该得到一个填充的 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 的问题,但我不清楚您收到的“一般错误”是什么。我猜这个问题可能是由于“反序列化”一个空响应。

于 2013-04-03T04:23:25.197 回答
1

ServiceStack 不支持使用 3rd 方 SOAP 库或客户端代理进行故障排除。

有关集成测试中的异常示例,请参阅WebServicesTests.cs。对于 SOAP,您还需要阅读ServiceStack 的 SOAP 支持及其限制

于 2013-04-02T21:30:03.077 回答
1

我们遇到了未填充 ResponseStatus 的问题 - 我们使用 DataContract/DataMember 修饰了 Response DTO,但没有使用 ResponseStatus 属性。一旦我们添加了那个装饰,一切都很愉快。

于 2013-08-29T11:47:14.290 回答