我的 Web 控制臺出現問題,首先它在沒有contentType: 'application/json; charset=UTF-8',ajax 方法的情況下給我錯誤 415,然后給我錯誤 400。
如果錯誤在后端代碼中,我也嘗試進行除錯,但它永遠不會發生并且它會跳出(這沒有任何意義,除錯器應該運行......)
我的目標是回傳一個用戶串列和他們的電子郵件,像這樣
//嘗試在我的服務中執行此操作
IEnumerable()
//class c#
ShowUsers:
(string)Username: User1
(string)Email:[email protected]
但我在 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 方法測驗控制器和我在沒有 gRPC 的情況下測驗的 ajax 并且作業正常)但是你會知道我在做什么(它的控制器和 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);
}
阿賈克斯方法:
$(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>');
}
});
});
歡迎任何幫助
uj5u.com熱心網友回復:
雙向流式 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 創建的通道(我假設您知道它)。現在你可以把它變成一個服務,并通過你的控制器的依賴注入來呼叫它。我沒有測驗它,所以它可能有一些編譯錯誤,但方法是正確的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/483389.html
