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

时间:2013-03-25 13:27:03

标签: c# servicestack

我正在尝试使用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异常的原因是什么?

2 个答案:

答案 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"
}