ServiceStack JsonServiceClient发送使用路由属性抛出异常未找到

本文关键字:抛出异常 属性 路由 JsonServiceClient ServiceStack | 更新日期: 2023-09-27 18:05:50

我试图使用servicestack做一个简单的api post调用,它一直抛出一个异常"未找到"。当使用web浏览器rest api(例如postman)直接向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"}系统。异常{ServiceStack.ServiceClient.Web。WebServiceException},ServiceStack.ServiceClient.Web.ServiceClientBase.ThrowWebServiceException [TResponse](例外例如,字符串requestUri) atServiceStack.ServiceClient.Web.ServiceClientBase.ThrowResponseTypeException TResponse(对象请求,例外情况,字符串requestUri)ServiceStack.ServiceClient.Web.ServiceClientBase.HandleResponseException [TResponse](例外例如,对象请求,字符串requestUri,函数1 createWebRequest, FuncgetResponse TResponse&响应)ServiceStack.ServiceClient.Web.ServiceClientBase.Send TResponse(对象请求)ApiService"2。帖子(字符串path, TParams body) inApiService.cs: 81行

关于servicestack的新API的文档提到了使用Route属性装饰请求DTO和使用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异常?

ServiceStack JsonServiceClient发送使用路由属性抛出异常未找到

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异常?

我不太确定。如果你能提供你的"Service"类,可能会有帮助。

如果你有一个Service类,比如

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

解决这个问题的方法是确保在api上启用了预定义路由的servicestack特性。一旦这样做了,你就不需要再为请求对象上的Route属性操心了。

终端主机配置现在看起来像这样:

new EndpointHostConfig
{
    DefaultContentType = ContentType.Json,
    EnableFeatures = Feature.None
                            .Add(Feature.Json)
                            .Add(Feature.PredefinedRoutes),
    GlobalResponseHeaders = new Dictionary<string, string>(),
    DefaultRedirectPath = "/documentation"
}