我正在尝试使用servicestack进行简单的api post调用,并且它不断抛出“未找到”的异常。当使用网络浏览器rest api直接向api进行相同的后呼叫时,例如,邮差,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; }
}
使用基本uri初始化JsonServiceClient,但以下调用失败
_client = new JsonServiceClient(_apiUri);
_client.HttpMethod = HttpMethods.Post;
var response = _client.Send(body);
我抓住的例外是:
$ exception {“Not Found”} System.Exception {ServiceStack.ServiceClient.Web.WebServiceException} at ServiceStack.ServiceClient.Web.ServiceClientBase.ThrowWebServiceException [τ响应(异常 ex,String requestUri)at ServiceStack.ServiceClient.Web.ServiceClientBase.ThrowResponseTypeException [τ响应(对象 request,Exception ex,String requestUri)at ServiceStack.ServiceClient.Web.ServiceClientBase.HandleResponseException [τ响应(异常 ex,对象请求,字符串requestUri,Func
1 createWebRequest, Func
2 getResponse,TResponse&amp;回应) ServiceStack.ServiceClient.Web.ServiceClientBase.Send [τ响应(对象 请求) ApiService`2.Post(字符串 路径,TParams身体) ApiService.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异常的原因是什么?
答案 0 :(得分:1)
您的Register类中的Everthing看起来是正确的。
对于您的客户来电,我会将其更改为
_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方法处理路由。基本上它会尝试找到一个Service类(继承Service标记接口的任何类),它将请求对象(Register)作为参数,它将使用Http方法作为调用的“函数”。
导致未找到异常的原因是什么?
不完全确定。如果您可以提供“服务”课程,则可能有所帮助。
如果您有像
这样的服务类public class RegisterService : Service
{
public RegistrationResponse Post(Register request)
{
//service code
return new RegistrationResponse();
}
}
路由应该有效。
答案 1 :(得分: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"
}