Я не знаком с C# API, но могу немного рассказать о gRP C API, и, возможно, он поможет вам в реализации C#.
gRP C модель ошибки Модель ошибки логически определяется как google.rp c .Status , экземпляр которого возвращается клиенту при возникновении ошибки API. В следующем фрагменте кода показан общий дизайн модели ошибки, которая возвращается, когда что-то идет не так:
package google.rpc;
message Status {
// A simple error code that can be easily handled by the client. The
// actual error code is defined by `google.rpc.Code`.
int32 code = 1;
// A developer-facing human-readable error message in English. It should
// both explain the error and offer an actionable resolution to it.
string message = 2;
// Additional error information that the client code can use to handle
// the error, such as retry delay or any business possible errors
repeated google.protobuf.Any details = 3;
}
Вы должны использовать поле сведений, чтобы передать дополнительную информацию об ошибке. Например, для InvalidArgument вы должны передать объект BadRequest с нарушениями полей
Что-то вроде (Golang code, надеюсь, это имеет смысл для вас)
st := status.New(codes.InvalidArgument, "invalid username")
v := &BadRequest_FieldViolation{
Field: "username",
Description: "The username must only contain alphanumeric characters",
}
br := &BadRequest{}
br.FieldViolations = append(br.FieldViolations, v)
st, _ := st.WithDetails(br)
Здесь - это список объектов, предоставляемых gRP C, который вы можете использовать в качестве сведений об ошибке, если любой из них соответствует вашему сценарию, вы всегда можете создать свой собственный.
Рекомендуется возвращать в поле сведений что-то, связанное с бизнесом. Как известный код ошибки. Таким образом, ваш клиент сможет ответить на проблему.
errorDetail := &BusinessError{
ErrorCode: CODE,
ErrorMessage: "Failed to filter hotel rooms",
}
st := status.New(codes.Internal, "Something went wrong :( ")
st, _ = st.WithDetails(errorDetail)