C# WebApi - 在 HTTPRequest 中发送长文本不起作用

Posted

技术标签:

【中文标题】C# WebApi - 在 HTTPRequest 中发送长文本不起作用【英文标题】:C# WebApi - Sending long text in HTTPRequest not working 【发布时间】:2021-10-16 00:29:37 【问题描述】:

我正在开发一个也可用作 API 网关的 WebApp(Razor 页面)。 WebApp 从另一个 WebAPI 项目(同一解决方案的一部分)获取一些数据。 问题是当我对 WebAPI 执行 HTTPRequest 时,如果请求不是太长,WebAPI 会处理它,但是当我尝试发送更长的请求(长字符)时,它会拒绝它并发回 404 .

WebApp 是一个基本的 CMS。因此,该应用程序将向用户提供网页的创建。我使用的是 restful 请求模型,所以请求看起来像这样:


string baseURL = @"https://localhost:5001";

public async Task<string> CreatePageAsync(string pageTitle, string pageBody, int? pageOrder, string userID)

      if (pageTitle != null && pageBody != null && pageOrder != null && userID != null)
      
           string fullURL = baseURL + $"/api/pages/create/page/title/pageTitle/body/pageBody/order/pageOrder/user/userID";

           var request = new HttpRequestMessage(HttpMethod.Post, fullURL);
           HttpResponseMessage response = await _httpClient.SendAsync(request);

           if (!response.IsSuccessStatusCode)
           
                return "error";
           
       

       return "ok";


您可以想象,“pageBody”属性负责请求的长度。所以,当我用简短的单词测试WebAPI时,它工作得很好,但是如果我从互联网上复制一篇文章(只是文本)并将其用作正文(模拟用户的内容),如果它是一个长的,它将返回 404。

另一方面,WebAPI 如下所示:


        [HttpPost("Create/page/title/pageTitle/body/pageBody/order/pageOrder/user/userID")]
        //[ValidateAntiForgeryToken]
        public async Task<string> CreatePage(string pageTitle, string pageBody, int pageOrder, string userID) //[Bind("pageName,pageHead,pageBody,userID")]
        
            if (ModelState.IsValid)
            
                DateTime now = DateTime.Now;

                WebPage newPage = new WebPage()
                
                    PageID = _globalServices.GuidFromString(_globalServices.GetSeed()),
                    PageDateCreated = now,
                    PageDateUpdated = now,
                    PageOrder = pageOrder,
                    PageTitle = pageTitle,
                    PageBody = pageBody,
                    UserID = userID
                ;

                try
                
                    await _pagesDBContext.Pages.AddAsync(newPage);
                    await _pagesDBContext.SaveChangesAsync();
                
                catch (Exception e)
                
                    string message = "ERROR: Could not save to the database.\n";
                    return message + e.Message;
                

                return "Page saved";
            

            return "ERROR: Model invalid";
        

我将请求作为简单文本发送。不知道有没有更好的办法。

有什么想法吗?

【问题讨论】:

有多长? 例如,我正在测试一个正好有 4024 个字符的正文。 【参考方案1】:

我没有足够的代表发表评论,但您可以在 GET 请求中发送的最大字符数似乎是 2,048。

【讨论】:

感谢弗劳斯基!我想我发现了两个不同的问题。第一个是角色。我使用的是从 IT 文章中复制的文本的一部分,其中包含诸如“/,()”之类的字符,尤其是大斜线(我相信这就是这个“/”字符的名称),这令人困惑并被采取作为查询本身的除数。所以我删除了那些 - 以及其他一些特殊字符 - 并且它起作用了!第二个是长度。它将接受 4000 个字符的正文,但不接受 5500 个字符的正文。所以现在我需要一些关于如何处理特殊字符和长度的想法。想法? 我很抱歉我现在才看到这个。我希望你能解决它! 我永远不会原谅你的老气...哈哈,现在说真的,我把它放在一边,所以我不会阻止自己(如果不立即解决,这是一个问题)。我明天需要展示这个,所以我想我会先让它工作,然后再打磨它。所以不要走得太远,我可能需要一些备份! 没问题!我无论如何都不是专家,但两个脑袋总是比一个好!

以上是关于C# WebApi - 在 HTTPRequest 中发送长文本不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 C# Caliburn Micro WPF 中异步和等待获取 HttpRequest 时更新 ProgressBar

c# WebBrower 与 HttpRequest配合 抓取数据

webapi

有没有办法在 HttpRequest 中同时返回 StatusCode 和 Content?

在 ASP.NET Core 控制器中模拟 HttpRequest

调用 HttpRequest.GetBufferlessInputStream 后不支持此方法或属性