【发布时间】:2026-01-15 21:30:01
【问题描述】:
我需要向客户端发送自定义异常消息。 我有以下代码:
- 在 Startup.cs ConfigureServices 方法中
services.AddGrpc(options => options.Interceptors.Add<ErrorInterceptor>());
- 在 ErrorInterceptor.cs 中
public override async Task<TResponse> UnaryServerHandler<TRequest, TResponse>(TRequest request, ServerCallContext context, UnaryServerMethod<TRequest, TResponse> continuation)
{
try
{
return await continuation(request, context);
}
catch (ValidationException validationExc)
{
await WriteResponseHeadersAsync(StatusCode.InvalidArgument, translation =>
translation.GetEnumTranslation(validationExc.Error, validationExc.Parameters));
}
catch (Exception)
{
await WriteResponseHeadersAsync(StatusCode.Internal, translation =>
translation.GetEnumTranslation(HttpStatusCode.InternalServerError));
}
return default;
Task WriteResponseHeadersAsync(StatusCode statusCode, Func<ITranslationService, string> getMessage)
{
var httpContext = context.GetHttpContext();
var translationService = httpContext.RequestServices.GetService<ITranslationService>();
var errorMessage = getMessage(translationService);
var responseHeaders = new Metadata
{
{ nameof(errorMessage) , errorMessage },//1) can see in browser's devTools, but not in the code
{ "content-type" , errorMessage },//2) ugly, but works
};
context.Status = new Status(statusCode, errorMessage);//3) not working
return context.WriteResponseHeadersAsync(responseHeaders);//4) alternative?
}
}
- 在掩码-http.service.ts中
this.grpcClient.add(request, (error, reply: MaskInfoReply) => {
this.grpcBaseService.handleResponse<MaskInfoReply.AsObject>(error, reply, response => {
const mask = new Mask(response.id, response.name);
callback(mask);
});
});
- 在 grpc-base.service.ts 中
handleResponse<T>(error: ServiceError,
reply: {
toObject(includeInstance?: boolean): T;
},
func: (response: T) => void) {
if (error) {
const errorMessage = error.metadata.headersMap['content-type'][0];
this.toasterService.openSnackBar(errorMessage, "Ok");
console.error(error);
return;
}
const response = reply.toObject();
func(response);
}
- 我想使用 Status 发送错误(评论 3),但它没有改变
- 我想知道是否有另一种方法可以不在响应标头中发送它(评论 4)
- 我尝试添加自定义响应标头(评论 1),但我在客户端代码中收到的唯一一个是“内容类型”,所以我决定覆盖它(评论 2)
【问题讨论】:
-
嗨你发现了吗,我在同样的情况下我需要这样做。
标签: c# asp.net typescript .net-core grpc