【问题标题】:Pass data from Angular to .Net Core Web Api with "/" character使用“/”字符将数据从 Angular 传递到 .Net Core Web Api
【发布时间】:2021-06-13 09:49:31
【问题描述】:

我在将数据从 angular 传递到 webapi 时遇到问题。 我需要从我的数据库中翻译一些短语,一切正常,直到我的短语看起来像这样:

“无休息日”

因为在这种情况下,我对 webapi 的请求看起来像:

https://localhost:44973/api/translation/getResstring/day%20w/o%20break

还有那个字符 / 破坏请求。 如何正确地将其传递给 WebApi?我昨天匆忙做了,在 Angular 端编码并在 Web Api 端解码,但它不起作用,所以我决定恢复它。

昨天的尝试,角度应用:

[...]
public getResstringByPhrase(
source: string
): Observable<string> {
  const result = this.http.get(this.url + "getResstring/" + source, { responseType: 'text' })
  return result
}
[...]

.net Core 网络接口:

[HttpGet("{*phrase}")]
[Route("getResstring/{phrase}")]
public IActionResult Get(string phrase)
{
  var resstring = _translationRepository.GetResstringByPhrase(phrase);
  return new OkObjectResult(resstring);
}

Startup.cs(仅配置):

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
  if (env.IsDevelopment())
  {
    app.UseDeveloperExceptionPage();
  }

  app.UseHttpsRedirection();

  app.UseRouting();

  app.UseAuthorization();

  app.UseEndpoints(endpoints =>
  {
    endpoints.MapControllers();
  });

} }

但即使有这种尝试,它也不适用于带有“/”符号的短语

#更新

冲突的操作:

   [HttpGet("{languageCharset}/{resstring}")]
    [Route("{languageCharset}/{resstring}")]
    public IActionResult Get(string resstring, LanguageCharset languageCharset)
    {
      var translate = _translationRepository.GetTranslatedByResstring(resstring, languageCharset);
      return new OkObjectResult(translate);
    }

#更新 2:

我做到了,现在“/”可以工作,但是“+”有问题。代码

Webapi:

[HttpGet("{phrase}")]
    [Route("getResstring/{phrase}")]
    public IActionResult Get(string phrase)
    {
      phrase = HttpUtility.UrlDecode(phrase);
      var resstring = _translationRepository.GetResstringByPhrase(phrase);
      return new OkObjectResult(resstring);
    }

Angular 应用:

if( translatedElements[index].getIsTranslated() === false ) {
          this.getResstringByPhrase(encodeURIComponent(translatedElements[index].getValue())).subscribe(async res => {
            const translatedLabel = await this.GetTranslatedByResstring(res, 1045).toPromise()
            if (translatedLabel.getPhrase() !== '') {
              translatedElements[index].setValue(translatedLabel.getPhrase())
            }   
          })
        }

现在错误是(仅当短语中有“+”时出现):

HTTP 错误 404.11 - 未找到

请求过滤模块被配置为拒绝替代双重解决方案的取消。 (对不起,我的语言翻译)

【问题讨论】:

    标签: angular asp.net-core request asp.net-core-webapi


    【解决方案1】:

    您可以使用星号 * 或双星号 ** 作为路由参数的前缀:

    例如:

    [Route("api/[controller]")]
    [ApiController]
    public class LanguagesController : Controller
    {
        [Route("getResstring/{*phrase}")]
        public string GetResstringByPhrase(string phrase)
        {
            return "aa";
        }
    
    }
    

    您可以发送请求网址,例如:https://localhost:44973/api/languages/getResstring/day%20w/o%20break

    确保您的 Startup.cs 应如下所示:

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
    

    结果(为了测试,我只是使用浏览器发送请求。浏览器会自动对url进行编码):

    参考:

    https://docs.microsoft.com/en-us/aspnet/core/fundamentals/routing?view=aspnetcore-5.0#route-template-reference

    更新:

    您的代码有错误。模型无法作为路由值传递。它可以从查询字符串或正文传递。因此您不能使用[Route("{languageCharset}/{resstring}")] 将模型数据传递给操作。

    然后,您需要使用特定的属性(例如[FromQuery][FromBody][FromRoute])来指定参数来源。

    路由和查询字符串的区别在于:https://localhost:44973/api/languages/getResstring?Id=1,getResstring是路由值。?Id=1是查询字符串。

    [Route("api/[controller]")]
    [ApiController]
    public class LanguagesController : Controller
    {
        [Route("getResstring/{*phrase}")]
        public string GetResstringByPhrase(string phrase)
        {
            return "aa";
        }
        [HttpGet]
        [Route("{resstring}")]
        public IActionResult Get([FromRoute]string resstring,[FromQuery]LanguageCharset languageCharset)
        {
            return Ok();
        }
    }
    

    结果:

    更新 2

    因为不能在路由中使用加号,这是一个 IIS 问题:

    请看下面的帖子:

    double escape sequence inside a url : The request filtering module is configured to deny a request that contains a double escape sequence

    您需要在web.config 中添加以下部分:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration> 
      <system.webServer>
        <security>
          <requestFiltering allowDoubleEscaping="true" />
        </security>
      </system.webServer>
    </configuration>
    

    结果:

    注意:

    如果您的项目中没有 web.config 文件,您可以按照以下步骤创建它:

    1.右击你的项目->选择Add->选择New Item:

    2.在搜索栏中搜索config->选择Web Configuration File:

    【讨论】:

    • 谢谢,它看起来会工作,但看看我更新的问题。我在 resstring 中添加了 *,但在尝试执行此操作时,当我在路径的 resstring 部分下调试时,在此示例中它看起来像这样:phrase="getResstring/day w/o break"。我只想得到短语=“没有休息的日子”。如果我把它放在路由中,而不是 httpget,我会收到“值 'getResstring' 无效。”
    • 您好,为什么要添加多条路线?在您的场景中,您似乎需要[Route("getResstring/{*phrase}")]
    • 你从哪里得到这个错误信息?一定要删除[HttpGet("{*phrase}")]
    • 您在编辑中使用了[Route("getResstring/{phrase}")] 而不是[Route("getResstring/{*phrase}")]。请小心。
    • 请问您是从哪里得到这个错误的?如果没有命中端点,它只会返回 404 Http 状态错误。请学习设置断点来调试代码。
    【解决方案2】:

    如果我输入:https://localhost:44397/api/translation/getResstring/polish

    然后我收到:

    {"type":"https://tools.ietf.org/html/rfc7231#section-6.5.1","title":"One or more validation errors occurred.","status":400,"traceId":"|cfc7e08b-41bcf96eadd38d17.","errors":{"languageCharset":["The value 'getResstring' is not valid."]}}
    

    如果我输入:https://localhost:44397/api/translation/getResstring/day%20w/o%20break

    然后我只是收到:找不到页面

    当我删除所有 * 时,第一次尝试工作,第二次尝试相同

    【讨论】:

    • 请编辑线程并分享您的详细代码。不确定您的languageCharset是什么。您在操作中是否做了其他事情?请检查您的项目,没有相同的端点。
    • 检查你在项目中的操作,如果它需要一个包含languageCharset属性的参数。
    • 我猜这可能是由这行引起的:_translationRepository.GetResstringByPhrase。确保你的操作中只有[Route("getResstring/{*phrase}")]。不要使用[HttpGet("{*phrase}")][Route("getResstring/{phrase}")]中的任何一个。
    • 只有你分享详细的代码,我们才会解决你的问题。否则,它总是在我的项目中工作。我建议你可以创建一个新的 repo 来重现你的问题。
    • 请回答我以前的问题。你从不回答我的问题,只说不起作用。我需要再问一次。你的asp.net核心版本是什么?你的错误消息有一个名为@的字段987654328@。也就是说,你可能有一个包含参数的动作,并且它有模型验证。请仔细检查。所有这些你需要与我们分享。还有,你的Startup.cs是什么。你如何配置路线模板(我在回答中提供了什么)?
    猜你喜欢
    • 2021-03-28
    • 2019-03-02
    • 2019-11-11
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    • 1970-01-01
    • 2019-05-28
    相关资源
    最近更新 更多