PDA

View Full Version : سوال: مشکل دریافت پاسخ از یک وب سرویس!



h.ranjbar72
شنبه 23 تیر 1403, 12:14 عصر
سلام دوستان

ما با یک وب سرویس سروکار داریم که فقط توی درخواست های با متد POST یک تغییراتی اعمال کرده و هنگام ارسال درخواست از سمت کد #C با خطای Bad Request از سمت سرور مواجه میشیم ولی هنگام ارسال درخواست با نرم افزار Postman براحتی جواب از سرور برمیگرده.

طبق بررسی که انجام دادم متوجه شدم تنها تفاوت درخواست ارسالی بین کد #C و نرم افزار Postman ست کردن مقدار x-sess-uuid در Header درخواست توسط نرم افزار Postman هست که نمیدونم چطوری خودکار این مقدار را توی هر درخواست جدید میسازه.

تلاش کردم همون مقدار x-sess-uuid که نرم افزار postman ست کرده را در Header درخواست از سمت #C هم اعمال کنم اما همچنان خطای Bad Request از سمت سرور برمیگرده.

سوالم اینه :

کسی اطلاع داره چطوری میشه این مقدار x-sess-uuid که مقدارش هر دفعه هم متغیره را از سمت کد #C تولیدش کرد و توی Header درخواست ست کرد؟

چطوری نرم افزار Postman تشخیص میده که وب سرویس اونسمت به این پارامتر توی Header درخواست نیاز داره و این مقدار را بر اساس چه فرمولی تولید میکنه؟

نمونه کد ارسال درخواست های REST را پایین قرار میدم.

155867

155868

155869



using System.Net;
using System.Net.Http;
using System.Net.Security;
using System.Web.Script.Serialization;

public static HttpResponseMessage WebReq = null;
public static string base_url = myProject.Properties.Settings.Default.URLWebServic e;

public enum MethodType
{
GET = 0,
POST = 1,
DELETE = 2
}

public static void sendRestRequest(string Route, MethodType Type, object Parameters, Dictionary<string, string> Headers = null, Dictionary<string, string> Cookies = null)
{
string URL = base_url + Route;

ServicePointManager.ServerCertificateValidationCal lback = new RemoteCertificateValidationCallback(delegate { return true; });
var cookieContainer = new CookieContainer();
using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer, AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate })
using (var client = new HttpClient(handler))
{

client.BaseAddress = new Uri(URL);

client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 PostmanRuntime/7.39.0 insomnia/9.3.2");

if (Headers != null)
{
foreach (var header in Headers)
{
client.DefaultRequestHeaders.Add(header.Key, header.Value);
}
}

if (Cookies != null)
{
foreach (var cookie in Cookies)
{
cookieContainer.Add(client.BaseAddress, new Cookie(cookie.Key, cookie.Value));
}
}


switch (Type)
{
case MethodType.GET:
WebReq = client.GetAsync(new Uri(URL)).Result;
break;
case MethodType.POST:
var objAsJson = new JavaScriptSerializer().Serialize(Parameters);
var stringContent = new StringContent(objAsJson, Encoding.UTF8, "application/json");
WebReq = client.PostAsync(URL, stringContent).Result;
break;
case MethodType.DELETE:
WebReq = client.DeleteAsync(URL).Result;
break;
}


if (WebReq != null && WebReq.StatusCode == HttpStatusCode.OK)
{
WebReq.EnsureSuccessStatusCode();

OnSuccess();
}
else
{
OnFailure();
}

}
}


//use function

Dictionary<string, string> headers = new Dictionary<string, string>();
Dictionary<string, string> cookies = new Dictionary<string, string>();

headers.Add("x-sess-uuid", "0.7f257e68.1720850372.31438db5");

cookies.Add("x-sess-uuid", "0.7f257e68.1720850372.31438db5");
cookies.Add("Path", "/v1/api/iserver/auth");
cookies.Add("Secure", "");
cookies.Add("HttpOnly", "");

var response = sendRestRequest("/iserver/auth/status", MethodType.POST, null, headers, cookies);

//

mmbguide
دوشنبه 25 تیر 1403, 16:38 عصر
سلام.

یک ExtensionMethod شبیه نمونه زیر ایجاد کردم:

public static HttpClient SetHeaders(this HttpClient httpClient)
{
httpClient.DefaultRequestHeaders.Authorization =
new System.Net.Http.Headers.AuthenticationHeaderValue(
"Bearer",
User.AccessToken?.Token);


return httpClient;
}


حالا متدی که باید درخواست ارسال کنه شبیه نمونه زیر ایجاد میکنیم. در خط دوم تمام Headerها تنظیم میشه و بعد درخواست ارسال میشه:

var client = CaspianHttpClientFactory.Create();


client.SetHeaders();


var request = new HttpRequestMessage(method, apiAddress);


var requestBody = JsonConvert.SerializeObject(command);


request.Content = new StringContent(requestBody, Encoding.UTF8, "application/json");


var result = await client.SendAsync(request);


result.EnsureSuccessStatusCode();


var content = await result.Content.ReadAsStringAsync();


در نمونه بالا، از تمام بخش های برنامه این متد را صدا میزنم و این متد در هر بار اجرا Token رو جهت احراز هویت در Request اضافه میکنه و بعد ارسال میکنه. حالا شما باید موارد مورد نیاز خودتان را بهش اضافه کنید.

ramin1402
شنبه 20 مرداد 1403, 17:31 عصر
تنظیمات سمت سرور چی قرار بدیم میشه راهنمایی کنین

ramin1402
شنبه 20 مرداد 1403, 17:46 عصر
تشکر میکنم جواب بدین

mmbguide
شنبه 20 مرداد 1403, 17:56 عصر
سمت سرور فقط کافیه سرویس مورد نظر را مشابه زیر فعال کنید:


builder.Services.AddAuthentication(option =>
{
option.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
option.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
option.DefaultSignInScheme = JwtBearerDefaults.AuthenticationScheme;


}).AddJwtBearer(option =>
{
option.TokenValidationParameters =
new Microsoft.IdentityModel.Tokens.TokenValidationPara meters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(
Encoding.UTF8.GetBytes(builder.Configuration.GetVa lue<string>("JwtPrivateKey"))),
ValidateLifetime = true,
ValidateAudience = false,
ValidateIssuer = false,
ClockSkew = TimeSpan.Zero,
};
});

ramin1402
شنبه 20 مرداد 1403, 19:00 عصر
سمت سرور میشه چه چیزی رو فعال کنم

mmbguide
شنبه 20 مرداد 1403, 22:38 عصر
سمت سرور میشه چه چیزی رو فعال کنم

در نمونه کد در پست شماره #5 با استفاده از AddAuthentication سرویس احراز هویت تزریق شده و در انتها باید بصورت app.UseAuthentication این سرویس را فعال کنید. در این خصوص مطالب بسیاری در اینترنت و همین سایت موجود است.