Ajax方法调用Web Api谁正在消费gRPC服务(如何从数据库获得列表?):错误415和400



我在我的web控制台有问题,首先它给我错误415没有contentType: 'application/json; charset=UTF-8',在ajax方法,它给我错误400。

我也尝试做调试,如果错误是在后端代码,但它从来没有发生,它跳脱(这没有任何意义,调试器应该运行…)

我的目标是返回一个用户和他们的电子邮件列表,类似如下

//尝试在我的服务中执行此操作
IEnumerable()

//类c#
ShowUsers:
(string)Username: User1
(string)Email:user1@example.com

但是我在gRPC中做这个,所以我将有一个web API控制器调用gRPC方法

由于gRPC中没有IEnumerable,所以我的原型和方法看起来像这样:

原型:

syntax = "proto3";
option csharp_namespace = "GrpcService1.Protos";
package UserAuth;
service UserAuth {
rpc GetAllUsers(MessageRequest) returns(ListUsersResponse);
}
message ListUserResponse{
string username = 1;
string email = 2;
}
message ListUsersResponse{
repeated ListUserResponse lstUsers = 1;
}
message MessageRequest{
string message = 1;
}

gRPC方法服务c#

public override Task<ListUsersResponse> GetAllUsers(MessageRequest request, ServerCallContext context)
{
//This gives me an IEnumerable<ShowUsers> (this is
correct)
var a = _userBll.getAllUsers();
//Here in this lines maybe be the problem but I don't
//know where (maybe be because of json type or something into a list)
//here im trying to put separate list of users and emails
var names = a.Select(x => x.Username);
var emails = a.Select(y => y.Email);
//here im trying to put the lists into a Response
var all = new ListUserResponse
{
Username = names.ToString(),
Email = emails.ToString()
};
//the above will give the same but the
ListUsersResponse is a repeated attribute
var response = new ListUsersResponse
{
LstUsers = { all }
};
//all ok
request.Message = "Sucess";
return Task.FromResult(response);
}

下面的代码是正确的(我用POST方法测试控制器和ajax我测试没有gRPC和工作良好),但你会有我在做什么(它的控制器和ajax方法)的想法

控制器(HTTPGET):

[HttpGet("getAllUserInfo_2"), Authorize]
public async Task<ActionResult<ListUsersResponse>> GetAll_2([FromBody] MessageRequest message)
{
_logger.Log(LogLevel.Information, "Request Received for AuthController::Register");
var results = await _userClient.GetAllUsersAsync(message);
_logger.Log(LogLevel.Information, "Sending Response from AuthController::Register");
return Ok(results);
}

Ajax方法:

$(function b() {
debugger;
var $users_A = $('#users_A');
$.ajax({
contentType: 'application/json; charset=UTF-8', //if I comment this gives me 415
url: uri_3_2,
type: 'GET',
dataType: 'json',
beforeSend: function(request) {
request.setRequestHeader("Authorization", 'Bearer ' + localStorage.getItem("key"));
},
success: function(date) {
$.each(data, function (i, rice) {
$users_A.append('<li>Name: ' + arroz.username + ' Email: ' + arroz.email + ' </li>');
});
},
error: function (xhr, textStatus, errorThrown) {
console.log('XHR:' + xhr + 'nTextStatus:' + textStatus + 'nErrorThrown:' + errorThrown);   //this should give me more info about the error but don't works... But it 
//works fine the implementation code
$users_A.append('<h4>ERRRROORRRR</h4>');
}
});
});

欢迎任何帮助

双向流RPC将是一个更好的选择显著提高你的表现,可能会解决你的问题。

你需要改变你的原型如下:

syntax = "proto3";
option csharp_namespace = "GrpcService1.Protos";
package UserAuth;
service UserAuth {
rpc GetAllUsers(MessageRequest) returns(stream UserResponse);
}
message UserResponse{
string username = 1;
string email = 2;
}
message MessageRequest{
string message = 1;
}

gRPC方法服务c#

public override async Task GetAllUsers(MessageRequest request, IServerStreamWriter<UserResponse> responseStream, ServerCallContext context)
{
var users = _userBll.getAllUsers();
foreach (user in users)
{
await responseStream.WriteAsync(new UserResponse
{
Username = user.Username.ToString(),
Email = user.Email.ToString()
});
}
}

在客户:

public async Task<List<UserResponse> GetAllUsers()
{
var userResponseList = new List<UserResponse>();
using var call = client.GetAllUsers(new MessageRequest());
while (await call.ResponseStream.MoveNext())
{
var userResponse = new UserResponse
{
Username = call.ResponseStream.Current.Username,
Email = call.ResponseStream.Current.Email
});
userResponseList.Add(userResponse);
}
return userResponseList;
}

客户端对象来自从gRPC服务URL创建的通道(我假设您知道它)。现在你可以把它变成一个服务,并通过依赖注入从你的控制器调用它。我没有测试它,所以它可能有一些编译错误,但方法是正确的。

最新更新