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, Func
getResponse 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异常?
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"
}