南希文档似乎说Pipelines.OnError
应该返回null
- 而BeforeResponse
允许null
和Response
对象。
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;
}
答案 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);
}