• הרשמה
    • התחברות
    • חיפוש
    • דף הבית
    • אינדקס קישורים
    • פוסטים אחרונים
    • קבלת התראות מהדפדפן
    • משתמשים
    • חיפוש בהגדרות המתקדמות
    • חיפוש גוגל בפורום
    • ניהול המערכת
    • ניהול המערכת - שרת private

    בקשת POST בC# יוצרת שגיאה

    באגים במערכת
    4
    56
    801
    טוען פוסטים נוספים
    • מהישן לחדש
    • מהחדש לישן
    • הכי הרבה הצבעות
    תגובה
    • הגיבו כנושא
    התחברו בכדי לפרסם תגובה
    נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
    • ע
      עידו @צדיק תמים נערך לאחרונה על ידי

      @צדיק-תמים אני יודע איך הבקשה נראית בפועל, אני כבר אחרי כל זה...

      צ תגובה 1 תגובה אחרונה תגובה ציטוט 0
      • צ
        צדיק תמים מומחה @עידו נערך לאחרונה על ידי צדיק תמים

        @עידו אם אתה יודע בטח תוכל להסביר מה ההבדל בין הבקשת POST JSON שאתה שולח ב C# ולא עובדת לבקשת POST JSON שאחרים שולחים וכן עובדת 🙂
        זה מה שאני מבקש מההתחלה
        ואם תאמר שאין הבדל - אז שוב, אין קשר לC#

        ע תגובה 1 תגובה אחרונה תגובה ציטוט 0
        • ע
          עידו @צדיק תמים נערך לאחרונה על ידי

          @צדיק-תמים
          אני יודע 3 דברים:

          1. שאותה בקשת ג'סון עובדת באתר אחד, ואצל ימות המשיח לא עובדת.
          2. כשאחרים שלחו ג'סון בC# זה לא עבד להם.
          3. כששולחים בשפות אחרות זה כן עובד.

          מה רץ מאחורי הקלעים ואיזה עוד אינפורמציה מועברת בדרך, אני לא יודע.

          מה שבטוח ימות המשיח מסרבים להתייחס לתוכן הג'סון.

          צ תגובה 1 תגובה אחרונה תגובה ציטוט 0
          • צ
            צדיק תמים מומחה @עידו נערך לאחרונה על ידי צדיק תמים

            @עידו כתב בבקשת POST בC# יוצרת שגיאה:

            כששולחים בשפות אחרות זה כן עובד.

            מי אמר? בדקת?
            מדגיש, אותה צורה בדיוק - HTTP POST, מסוג JSON, ושכל הפרמטרים בגוף הבקשה

            S תגובה 1 תגובה אחרונה תגובה ציטוט 0
            • S
              soris1989 @צדיק תמים נערך לאחרונה על ידי soris1989

              @צדיק-תמים אני בדקתי, ומה ש@עידו אומר זה אמת.
              יש בעיה בסיריאליזציה ב-C#, אגב, בדקתי את זה ב-postman וזה עובד (עם בקשת POST), ובדקתי את זה גם ב-PHP וזה גם עובד (גם עם בקשת POST).

              אם יש לך השגות על מה שנאמר כאן, אני מזמין אותך לנסות בעצמך את הנ"ל.

              צ תגובה 1 תגובה אחרונה תגובה ציטוט 1
              • צ
                צדיק תמים מומחה @soris1989 נערך לאחרונה על ידי

                @soris1989 כתב בבקשת POST בC# יוצרת שגיאה:

                אני בדקתי, ומה ש@עידו אומר זה אמת.
                יש בעיה בסיריאליזציה ב-C#

                איך נראה האובייקט עם הסריאליזציה הפגומה ואיך הוא היה אמור להיראות?

                @soris1989 כתב בבקשת POST בC# יוצרת שגיאה:

                בדקתי את זה ב-postman וזה עובד (עם בקשת POST)

                POST JSON? ככה?
                8c1ef5b5-d88c-4288-9711-dbafc5df00f0-CleanShot 2025-02-18 at 22.06.02@2x.png
                אתה יכול לעשות בסרגל הצד של פוסטמן ייצוא לCURL ולהעתיק לכאן?

                S תגובה 1 תגובה אחרונה תגובה ציטוט 0
                • S
                  soris1989 @צדיק תמים נערך לאחרונה על ידי soris1989

                  @צדיק-תמים

                  POSTMAN:
                  curl --location --request POST 'https://www.call2all.co.il/ym/api/UploadTextFile' \
                  --header 'Content-Type: application/json' \
                  --data-raw '{
                      "token": "<username>:<password>",
                      "what": "ivr2:14/text_file.ini",
                      "contents": "Some text message"
                  }'
                  
                  c#:
                  curl -X POST -d '{"token":"<username>:<password>","what":"ivr2:14/text_file.ini","contents":"Some test message"}' https://www.call2all.co.il/ym/api/UploadTextFile
                  

                  תגוובה ב-POSTMAN:

                  {
                      "responseStatus": "OK",
                      "message": "ok",
                      "yemotAPIVersion": 6
                  }
                  

                  תגובה ב-C#:

                  Response: {"yemotAPIVersion":6,"responseStatus":"EXCEPTION","message":"IllegalStateException(session token is required)"
                  

                  אז ככה, ב-C# ברגע שאתה משייך flag של -d ל-curl, זה אוטומטית יוצר בקשה עם:

                  Content-Type: application/x-www-form-urlencoded
                  

                  וזה לא נשלח עם:

                  Content-Type: application/json
                  

                  ה-body שנשלח לשרת של ימות הוא בפורמט json בעוד שה-content-type בפורמט של:
                  x-url-encoded.

                  לאחר מכן, ניסיתי לכפות על ה-httpClient לשים header של Content-Type: application/json, אך הוא מתעלם מזה....

                  ומכאן נובעת השגיאה, הבעיה היא לא בימות המשיח, אלא באופן בניית ה-CURL ב-C#, שה-body שנשלח לא תואם ל-content-type ב-header.

                  S ע צ 3 תגובות תגובה אחרונה תגובה ציטוט 0
                  • S
                    soris1989 @soris1989 נערך לאחרונה על ידי soris1989

                    @צדיק-תמים במידה ואתה חפץ לבדוק זאת בעצמך, זה הקוד:

                    static async Task UploadTextFileWithPost2()
                    {
                                var url = "https://www.call2all.co.il/ym/api/UploadTextFile";
                    
                                try
                                {
                                    var client = new HttpClient();
                    
                                    var obj = new
                                    {
                                        token = $"{Username}:{Password}",
                                        what = "ivr2:14/text_file.ini",
                                        contents = "Some test message"
                                    };
                    
                                    var json = JsonConvert.SerializeObject(obj);
                                    var content = new StringContent(json, Encoding.UTF8, "application/json");
                    
                                    var responseJ2 = await client.PostAsync(url, content);
                    
                                    // בדיקת מצב התגובה
                                    if (responseJ2.IsSuccessStatusCode)
                                    {
                                        // קריאת התוכן של התגובה
                                        var responseContent2 = await responseJ2.Content.ReadAsStringAsync();
                                        Console.WriteLine($"Response: {responseContent2}");
                                    }
                                    else
                                    {
                                        Console.WriteLine($"Error: {responseJ2.StatusCode}");
                                        return;
                                    }
                                }
                                catch (Exception ex)
                                {
                                    Console.WriteLine($"Exception: {ex.Message}");
                                }
                    
                                await Task.Delay(1000);
                                Console.WriteLine("Async work done!");
                     }
                    
                    תגובה 1 תגובה אחרונה תגובה ציטוט 0
                    • ע
                      עידו @soris1989 נערך לאחרונה על ידי

                      @soris1989 כתב בבקשת POST בC# יוצרת שגיאה:

                      @צדיק-תמים

                      POSTMAN:
                      curl --location --request POST 'https://www.call2all.co.il/ym/api/UploadTextFile' \
                      --header 'Content-Type: application/json' \
                      --data-raw '{
                          "token": "<username>:<password>",
                          "what": "ivr2:14/text_file.ini",
                          "contents": "Some text message"
                      }'
                      
                      c#:
                      curl -X POST -d '{"token":"<username>:<password>","what":"ivr2:14/text_file.ini","contents":"Some test message"}' https://www.call2all.co.il/ym/api/UploadTextFile
                      

                      תגוובה ב-POSTMAN:

                      {
                          "responseStatus": "OK",
                          "message": "ok",
                          "yemotAPIVersion": 6
                      }
                      

                      תגובה ב-C#:

                      Response: {"yemotAPIVersion":6,"responseStatus":"EXCEPTION","message":"IllegalStateException(session token is required)"
                      

                      אז ככה, ב-C# ברגע שאתה משייך flag של -d ל-curl, זה אוטומטית יוצר בקשה עם:

                      Content-Type: application/x-www-form-urlencoded
                      

                      וזה לא נשלח עם:

                      Content-Type: application/json
                      

                      ה-body שנשלח לשרת של ימות הוא בפורמט json בעוד שה-content-type בפורמט של:
                      x-url-encoded.

                      לאחר מכן, ניסיתי לכפות על ה-httpClient לשים header של Content-Type: application/json, אך הוא מתעלם מזה....

                      ומכאן נובעת השגיאה, הבעיה היא לא בימות המשיח, אלא באופן בניית ה-CURL ב-C#, שה-body שנשלח לא תואם ל-content-type ב-header.

                      לא ממש הבנתי על איזה flag או d דיברת, אבל זה מעניין, למה אתרים אחרים כן מקבלים את זה?

                      ולכאורה בקוד פשוט שלחת JSON אז למה בכל זאת הוא לא שולח את זה כסוג JSON?

                      S תגובה 1 תגובה אחרונה תגובה ציטוט 0
                      • S
                        soris1989 @עידו נערך לאחרונה על ידי soris1989

                        @עידו כתב בבקשת POST בC# יוצרת שגיאה:

                        curl -X POST -d

                        זה ה-flag:

                        curl -X POST *-d*
                        
                        ע תגובה 1 תגובה אחרונה תגובה ציטוט 0
                        • ע
                          עידו @soris1989 נערך לאחרונה על ידי

                          @soris1989 אבל בקוד רגיל בC# לא מוסיפים את זה, אני לא הוספתי בכל אופן...

                          S תגובה 1 תגובה אחרונה תגובה ציטוט 0
                          • S
                            soris1989 @עידו נערך לאחרונה על ידי soris1989

                            @עידו הרצתי עכשיו דרך ה-bash סידרה של שליחת בקשות CURL של POST, ואכן שבשביל שזה יעבוד, צריך להוריד את ה-flag של -d, ובמקום זה לשים flags של:

                            \--header "Content-Type: application/json" \--data-raw '{"token":"<username>:<password>","what":"ivr2:14/text_file.ini","contents":"Some test message"}'
                            

                            לגבי זה שזה עובד במקרים אחרים, אני לא יודע מה לומר לך. מה שכן, בשביל שזה יעבוד בפורמט JSON אתה תצטרך ככל הנראה לבנות CURL באופן ידני, כי ה-httpClient.PostAsync לא בונה נכון את ה-CURL.

                            בכל אופן, הצעתי לך אתמול פתרון שכן עובד, תשתמש בו.

                            ע תגובה 1 תגובה אחרונה תגובה ציטוט 1
                            • ע
                              עידו @soris1989 נערך לאחרונה על ידי

                              @soris1989 יש לי שרת, איך אני יכול לראות בו בדיוק מה מגיע אליו? כולל ההדר?

                              S תגובה 1 תגובה אחרונה תגובה ציטוט 0
                              • S
                                soris1989 @עידו נערך לאחרונה על ידי soris1989

                                @עידו אתה יכול בקוד להשתמש בסיפריות מוכנות של Logging לתוך קובץ.

                                הקוד הבא מאפשר את קבלת המחרוזת של ה-curl:

                                static async Task UploadTextFileWithPost2()
                                {
                                	var url = "https://www.call2all.co.il/ym/api/UploadTextFile";
                                
                                	try
                                	{
                                		var client = new HttpClient();
                                
                                		var obj = new
                                		{
                                			token = $"{Username}:{Password}",
                                			what = "ivr2:14/text_file.ini",
                                			contents = "Some test message"
                                		};
                                
                                		var json = JsonConvert.SerializeObject(obj);
                                		var content = new StringContent(json, Encoding.UTF8, "application/json");
                                
                                
                                		// Generate cURL command
                                		string curlCommand = GenerateCurlCommand("POST", url, client, content);
                                		Console.WriteLine("Generated cURL:");
                                		Console.WriteLine(curlCommand);
                                
                                		var responseJ2 = await client.PostAsync(url, content);
                                
                                		// בדיקת מצב התגובה
                                		if (responseJ2.IsSuccessStatusCode)
                                		{
                                			// קריאת התוכן של התגובה
                                			var responseContent2 = await responseJ2.Content.ReadAsStringAsync();
                                			Console.WriteLine($"Response: {responseContent2}");
                                		}
                                		else
                                		{
                                			Console.WriteLine($"Error: {responseJ2.StatusCode}");
                                			return;
                                		}
                                	}
                                	catch (Exception ex)
                                	{
                                		Console.WriteLine($"Exception: {ex.Message}");
                                	}
                                
                                	await Task.Delay(1000);
                                	Console.WriteLine("Async work done!");
                                }
                                
                                static string GenerateCurlCommand(string method, string url, HttpClient client, HttpContent content)
                                {
                                	StringBuilder sb = new StringBuilder();
                                	sb.Append($"curl -X {method} ");
                                
                                	// Add headers
                                	foreach (var header in client.DefaultRequestHeaders)
                                	{
                                		sb.Append($"-H \"{header.Key}: {string.Join("; ", header.Value)}\" ");
                                	}
                                
                                	// Add content body
                                	if (content != null)
                                	{
                                		string body = content.ReadAsStringAsync().Result;
                                		sb.Append($"-d '{body}' ");
                                	}
                                
                                	// Add URL
                                	sb.Append(url);
                                
                                	return sb.ToString();
                                }
                                
                                

                                המתודה GenerateCurlCommand, פולטת לך string עם ה- curl, את ה-string הזה תדפיס בתוך קובץ log או משהו בסגנון. וזה לגבי בקשות שאתה מריץ מהקוד שלך.

                                לגבי בדיקת בקשות שנכנסות למערכת שלך, במידה ואתה כותב ב asp.net core, אז תיצור middleware באופן הבא:

                                using Microsoft.AspNetCore.Http;
                                using System.Collections.Generic;
                                using System.IO;
                                using System.Threading.Tasks;
                                using Microsoft.Extensions.Logging;
                                
                                public class RequestLoggingMiddleware
                                {
                                    private readonly RequestDelegate _next;
                                    private readonly ILogger<RequestLoggingMiddleware> _logger;
                                
                                    public RequestLoggingMiddleware(RequestDelegate next, ILogger<RequestLoggingMiddleware> logger)
                                    {
                                        _next = next;
                                        _logger = logger;
                                    }
                                
                                    public async Task InvokeAsync(HttpContext httpContext)
                                    {
                                        // Log request method, URL, and headers
                                        _logger.LogInformation("Request Method: {Method}, Request URL: {Url}", httpContext.Request.Method, httpContext.Request.Path);
                                        
                                        // Log all headers
                                        foreach (var header in httpContext.Request.Headers)
                                        {
                                            _logger.LogInformation("Header: {Header}: {Value}", header.Key, header.Value);
                                        }
                                
                                        // Call the next middleware in the pipeline
                                        await _next(httpContext);
                                    }
                                }
                                
                                

                                בקוד של asp.net (לא CORE), תשים ב-global.asax:

                                using System;
                                using System.Web;
                                
                                public class Global : HttpApplication
                                {
                                    protected void Application_BeginRequest(object sender, EventArgs e)
                                    {
                                        HttpContext context = HttpContext.Current;
                                        
                                        // Log request method and URL
                                        var method = context.Request.HttpMethod;
                                        var url = context.Request.Url.ToString();
                                        
                                        // Log all headers
                                        foreach (var header in context.Request.Headers.AllKeys)
                                        {
                                            var headerValue = context.Request.Headers[header];
                                            System.Diagnostics.Debug.WriteLine($"Header: {header}: {headerValue}");
                                        }
                                
                                        // Log method and URL
                                        System.Diagnostics.Debug.WriteLine($"Request Method: {method}, Request URL: {url}");
                                    }
                                }
                                
                                
                                ע תגובה 1 תגובה אחרונה תגובה ציטוט 0
                                • צ
                                  צדיק תמים מומחה @soris1989 נערך לאחרונה על ידי

                                  @soris1989 כתב בבקשת POST בC# יוצרת שגיאה:

                                  אז ככה, ב-C# ברגע שאתה משייך flag של -d ל-curl

                                  מה הכוונה לשייך flag ל-curl בC#? 🤔 ממה שראיתי אתה שולח את הבקשה עם HttpClient של C# ולא curl

                                  S תגובה 1 תגובה אחרונה תגובה ציטוט 1
                                  • S
                                    soris1989 @צדיק תמים נערך לאחרונה על ידי soris1989

                                    פוסט זה נמחק!
                                    תגובה 1 תגובה אחרונה תגובה ציטוט 0
                                    • ע
                                      עידו @soris1989 נערך לאחרונה על ידי

                                      @soris1989 כתב בבקשת POST בC# יוצרת שגיאה:

                                      @עידו אתה יכול בקוד להשתמש בסיפריות מוכנות של Logging לתוך קובץ.

                                      הקוד הבא מאפשר את קבלת המחרוזת של ה-curl:

                                      static async Task UploadTextFileWithPost2()
                                      {
                                      	var url = "https://www.call2all.co.il/ym/api/UploadTextFile";
                                      
                                      	try
                                      	{
                                      		var client = new HttpClient();
                                      
                                      		var obj = new
                                      		{
                                      			token = $"{Username}:{Password}",
                                      			what = "ivr2:14/text_file.ini",
                                      			contents = "Some test message"
                                      		};
                                      
                                      		var json = JsonConvert.SerializeObject(obj);
                                      		var content = new StringContent(json, Encoding.UTF8, "application/json");
                                      
                                      
                                      		// Generate cURL command
                                      		string curlCommand = GenerateCurlCommand("POST", url, client, content);
                                      		Console.WriteLine("Generated cURL:");
                                      		Console.WriteLine(curlCommand);
                                      
                                      		var responseJ2 = await client.PostAsync(url, content);
                                      
                                      		// בדיקת מצב התגובה
                                      		if (responseJ2.IsSuccessStatusCode)
                                      		{
                                      			// קריאת התוכן של התגובה
                                      			var responseContent2 = await responseJ2.Content.ReadAsStringAsync();
                                      			Console.WriteLine($"Response: {responseContent2}");
                                      		}
                                      		else
                                      		{
                                      			Console.WriteLine($"Error: {responseJ2.StatusCode}");
                                      			return;
                                      		}
                                      	}
                                      	catch (Exception ex)
                                      	{
                                      		Console.WriteLine($"Exception: {ex.Message}");
                                      	}
                                      
                                      	await Task.Delay(1000);
                                      	Console.WriteLine("Async work done!");
                                      }
                                      
                                      static string GenerateCurlCommand(string method, string url, HttpClient client, HttpContent content)
                                      {
                                      	StringBuilder sb = new StringBuilder();
                                      	sb.Append($"curl -X {method} ");
                                      
                                      	// Add headers
                                      	foreach (var header in client.DefaultRequestHeaders)
                                      	{
                                      		sb.Append($"-H \"{header.Key}: {string.Join("; ", header.Value)}\" ");
                                      	}
                                      
                                      	// Add content body
                                      	if (content != null)
                                      	{
                                      		string body = content.ReadAsStringAsync().Result;
                                      		sb.Append($"-d '{body}' ");
                                      	}
                                      
                                      	// Add URL
                                      	sb.Append(url);
                                      
                                      	return sb.ToString();
                                      }
                                      
                                      

                                      המתודה GenerateCurlCommand, פולטת לך string עם ה- curl, את ה-string הזה תדפיס בתוך קובץ log או משהו בסגנון. וזה לגבי בקשות שאתה מריץ מהקוד שלך.

                                      לגבי בדיקת בקשות שנכנסות למערכת שלך, במידה ואתה כותב ב asp.net core, אז תיצור middleware באופן הבא:

                                      using Microsoft.AspNetCore.Http;
                                      using System.Collections.Generic;
                                      using System.IO;
                                      using System.Threading.Tasks;
                                      using Microsoft.Extensions.Logging;
                                      
                                      public class RequestLoggingMiddleware
                                      {
                                          private readonly RequestDelegate _next;
                                          private readonly ILogger<RequestLoggingMiddleware> _logger;
                                      
                                          public RequestLoggingMiddleware(RequestDelegate next, ILogger<RequestLoggingMiddleware> logger)
                                          {
                                              _next = next;
                                              _logger = logger;
                                          }
                                      
                                          public async Task InvokeAsync(HttpContext httpContext)
                                          {
                                              // Log request method, URL, and headers
                                              _logger.LogInformation("Request Method: {Method}, Request URL: {Url}", httpContext.Request.Method, httpContext.Request.Path);
                                              
                                              // Log all headers
                                              foreach (var header in httpContext.Request.Headers)
                                              {
                                                  _logger.LogInformation("Header: {Header}: {Value}", header.Key, header.Value);
                                              }
                                      
                                              // Call the next middleware in the pipeline
                                              await _next(httpContext);
                                          }
                                      }
                                      
                                      

                                      בקוד של asp.net (לא CORE), תשים ב-global.asax:

                                      using System;
                                      using System.Web;
                                      
                                      public class Global : HttpApplication
                                      {
                                          protected void Application_BeginRequest(object sender, EventArgs e)
                                          {
                                              HttpContext context = HttpContext.Current;
                                              
                                              // Log request method and URL
                                              var method = context.Request.HttpMethod;
                                              var url = context.Request.Url.ToString();
                                              
                                              // Log all headers
                                              foreach (var header in context.Request.Headers.AllKeys)
                                              {
                                                  var headerValue = context.Request.Headers[header];
                                                  System.Diagnostics.Debug.WriteLine($"Header: {header}: {headerValue}");
                                              }
                                      
                                              // Log method and URL
                                              System.Diagnostics.Debug.WriteLine($"Request Method: {method}, Request URL: {url}");
                                          }
                                      }
                                      
                                      

                                      בשרת שלי אין net (סייבר פאנל מבוסס לינוקס)

                                      S תגובה 1 תגובה אחרונה תגובה ציטוט 0
                                      • S
                                        soris1989 @עידו נערך לאחרונה על ידי soris1989

                                        @עידו זה משהו שאתה מטמיע בקוד אצלך, ודרך הקוד נתוני ה-request מוכנסים לתוך קובץ log.

                                        אתה כותב ב-asp.net?

                                        ע תגובה 1 תגובה אחרונה תגובה ציטוט 0
                                        • ע
                                          עידו @soris1989 נערך לאחרונה על ידי

                                          @soris1989 כתב בבקשת POST בC# יוצרת שגיאה:

                                          @עידו זה משהו שאתה מטמיע בקוד אצלך, ודרך הקוד נתוני ה-request מוכנסים לתוך קובץ log.

                                          אתה כותב ב-asp.net?

                                          אני לא כותב בASP ולדעתי השרת לא יודע להריץ ASP

                                          תודה

                                          S תגובה 1 תגובה אחרונה תגובה ציטוט 0
                                          • S
                                            soris1989 @עידו נערך לאחרונה על ידי soris1989

                                            @עידו באיזו שפה אתה כותב?

                                            אם זה אתה משתמש באחסון VPS, אז תוכל ללכת לתיקית ה-apache או ngnix ושם יש לוגים של כל הבקשות שנכנסות לשרת.
                                            באחסון שיתופי (shared), אתה יכול להנפיק את קובץ ה-LOG דרך הקוד של השפה שבה אתה כותב, מן הסתם ה-entry point של האפליקציה שלך מקבלת את ה-request שמכיל מידע על הבקשה וה-headers שלה.

                                            ע תגובה 1 תגובה אחרונה תגובה ציטוט 0
                                            • פוסט ראשון
                                              פוסט אחרון