Nancy OnError不接受Response对象?

时间:2015-01-19 15:28:16

标签: json lambda nancy onerror

南希文档似乎说Pipelines.OnError应该返回null - 而BeforeResponse允许nullResponse对象。

StackOverflow上的所有示例like this one和许多代码示例都显示OnError中返回Response,就像在BeforeRequest中一样。

当我尝试为Pipelines.OnError返回HTTPStatus字符串时,一切正常!

但是当我尝试返回一个Response时,我收到一个编译器错误: 运营商' + ='不能应用于Nancy.ErrorPipeline' Nancy.ErrorPipeline'和' lambda表达'

我在Nancy示例中几乎完全模拟了代码,除了我的是TinyIocContainer,而示例是使用StructureMap容器​​和StructureMap派生的bootstrapper

这是我的代码:

    const string errKey = "My proj error";
    const string creationProblem = "Message creation (HTTP-POST)";
    const string retrievalProblem = "Message retrieval (HTTP-GET)";

    public void Initialize(IPipelines pipelines)
    {
        string jsonContentType = "application/json";
        byte[] jsonFailedCreate = toJsonByteArray(creationProblem);
        byte[] jsonFailedRetrieve = toJsonByteArray(retrievalProblem);

        Response responseFailedCreate = new Response
        {
            StatusCode = HttpStatusCode.NotModified,
            ContentType = jsonContentType,
            Contents = (stream) => 
                stream.Write(jsonFailedCreate, 0, jsonFailedCreate.Length)
        };

        Response responseFailedRetrieve = new Response
        {
            StatusCode = HttpStatusCode.NotFound,
            ContentType = jsonContentType, 
            Contents = (stream) => 
                stream.Write(jsonFailedRetrieve, 0, jsonFailedRetrieve.Length)
        };

        // POST - error in Create call
        pipelines.OnError += (context, exception) =>
            {
                // POST - error during Create call
                if (context.Request.Method == "POST")
                    return responsefailedCreate;

                // GET - error during Retrieve call
                else if (context.Request.Method == "GET")
                    return responseFailedRetrieve;

                // All other cases - not supported
                else
                    return HttpStatusCode.InternalServerError;
            };
    }


    private byte[] toJsonByteArray(string plainString)
    {
        string jsonString = new JObject { { errKey, plainString } }.ToString();
        byte[] result = Encoding.UTF8.GetBytes(jsonString);
        return result;
    }

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,我找到了解决问题的方法:http://paulstovell.com/blog/consistent-error-handling-with-nancy

你应该在Bootstrapper上覆盖RequestStartup,这里是我的测试代码:

    protected override void RequestStartup(TinyIoCContainer container, IPipelines pipelines, NancyContext context)
    {           
        pipelines.OnError.AddItemToEndOfPipeline((ctx, ex) =>
            {                                       
                DefaultJsonSerializer serializer = new DefaultJsonSerializer();
                Response error = new JsonResponse(ex.Message,serializer);
                error.StatusCode = HttpStatusCode.InternalServerError;
                return error;
            });                 

        base.RequestStartup(container, pipelines, context);
    }