1

我正在尝试使用 servicestack 进行简单的 api post 调用,并且它不断抛出“未找到”异常。当使用 web 浏览器 rest api(例如邮递员)直接对 api 进行相同的 post 调用时,api 调用有效。

我用路由属性装饰了我的请求对象

[Route("/register", "POST")]
public class Register : IReturn<RegistrationResponse>
{
    public DateTime? BirthDate { get; set; }

    public string Continue { get; set; }

    public string Email { get; set; }

    public string FirstName { get; set; }

    public string LastName { get; set; }

    public string Gender { get; set; }

    public string Password { get; set; }
}

JsonServiceClient 使用基本 uri 初始化,但以下调用失败

_client = new JsonServiceClient(_apiUri);
_client.HttpMethod = HttpMethods.Post;
var response = _client.Send(body);

我发现的例外是:

$exception {"Not Found"} System.Exception {ServiceStack.ServiceClient.Web.ServiceClientBase.ThrowWebServiceException[TResponse](Exception ex, String requestUri) at ServiceStack.ServiceClient.Web.ServiceClientBase.ThrowResponseTypeException {ServiceStack.ServiceClient.Web.WebServiceException} ServiceStack.ServiceClient.Web.ServiceClientBase.HandleResponseException [TResponse](对象请求,异常前,字符串 requestUri)[TResponse](异常前,对象请求,字符串 requestUri,Func 1 createWebRequest, Func2 getResponse,TResponse& 响应)在 ServiceStack.ServiceClient.Web。 ServiceClientBase.Send[TResponse](Object request) at ApiService`2.Post(String path, TParams body) in ApiService.cs:line 81

servicestack 上关于新 API 的文档提到了装饰请求 DTO 的 Route 属性的使用以及 IReturn 的使用,但是通过查看 Send 方法背后的代码,它正在从请求的名称中计算出其余的 api url ,这意味着您的请求 dto 不能命名为任何不同的名称。

public virtual TResponse Send<TResponse>(object request)
{
    var requestUri = this.SyncReplyBaseUri.WithTrailingSlash() + request.GetType().Name;
    var client = SendRequest(requestUri, request);

    try
    {
        var webResponse = client.GetResponse();
        return HandleResponse<TResponse>(webResponse);
    }
    catch (Exception ex)
    {
        TResponse response;

        if (!HandleResponseException(ex,
            request,
            requestUri,
            () => SendRequest(HttpMethods.Post, requestUri, request),
            c => c.GetResponse(),
            out response))
        {
            throw;
        }

        return response;
    }
}

是什么导致 Not Found 异常?

4

2 回答 2

1

您的 Register 类中的所有内容看起来都是正确的。

对于您的客户电话,我会将其更改为

_client = new JsonServiceClient(_apiUri);
_client.Post(new Register()); //assuming you can map your 'body' variable to a Register class

只是为了丢失额外的代码行。

它正在从请求的名称中计算出其余的 api url,这意味着您的请求 dto 不能被命名为任何不同的名称。

它正在计算其余 api 将命中的端点。一旦到达端点,ServiceStack 的内部应该根据 Operation(在本例中为 Register)和 Http 方法处理路由。基本上,它会尝试找到一个以请求对象(Register)为参数的服务类(任何继承服务标记接口的类),并将使用 Http 方法作为调用的“函数”。

是什么导致 Not Found 异常?

不完全确定这一点。如果您可以提供您的“服务”课程,它可能会有所帮助。

如果您有类似的服务类

public class RegisterService : Service
{
    public RegistrationResponse Post(Register request) 
    {
        //service code 
        return new RegistrationResponse();
    }
}

路由应该工作。

于 2013-03-25T16:03:52.067 回答
0

对此的修复是确保在 api 上启用了预定义路由的 servicestack 功能。完成此操作后,您无需担心请求对象上的 Route 属性。

端点主机配置现在如下所示:

new EndpointHostConfig
{
    DefaultContentType = ContentType.Json,
    EnableFeatures = Feature.None
                            .Add(Feature.Json)
                            .Add(Feature.PredefinedRoutes),
    GlobalResponseHeaders = new Dictionary<string, string>(),
    DefaultRedirectPath = "/documentation"
}
于 2013-03-25T15:31:47.987 回答