【问题标题】:C# - swagger inserting values and passing array of strings to Linq shows NULL instead of the values insertedC# - 大摇大摆地插入值并将字符串数组传递给 Linq 显示 NULL 而不是插入的值
【发布时间】:2017-05-05 11:21:23
【问题描述】:

在 Swagger 中,我插入了一些值,并且我想将包含这些值的字符串数组传递给 Linq。 (在这种情况下,ID 是字符串)。如果我传递一个简单的字符串,而不是一个数组,它可以插入一个值。但我需要传递一个值数组。

下面是 API 在尝试插入 2 个值时构建的链接(对于数组来说看起来很奇怪):http://localhost:port/api/Members?ids=97882831302&ids=97882831308

问题是数组显示 NULL 而不是插入的值。我收到以下错误:

"ExceptionMessage": "无法创建空常量值类型 '系统.字符串 []'。只有实体类型、枚举类型或原语 在这种情况下支持类型。”

public class MembersController : ApiController
    {
    public HttpResponseMessage GetAllMembersByIdentifiers(string[] ids) {
                using (sampleEntities entities = new sampleEntities()){
                    var numbers = entities.tblmembers
                        .Where(p => ids.Contains(p.identify)  ).ToList();

                    if (numbers != null)
                    {
                        return Request.CreateResponse(HttpStatusCode.OK, numbers);
                    }
                    else
                    {
                        return Request.CreateErrorResponse(HttpStatusCode.NotFound, "Member with id: " + ids + " not found");
                    }
                }
            }
}

【问题讨论】:

    标签: c# asp.net linq api swagger


    【解决方案1】:

    [FromUri] 在我的情况下进行了修复。集合参数类型可以是IEnumerable<...>

    默认情况下从 URL 正确填充其他参数令人困惑 - IMO 也应该发生在集合参数上,因为它是一个获取请求。

    您可以通过检查Request.RequestUri.AbsoluteUri来检查参数是否传递。

    [FromUri]:

    没有[FromUri]

    【讨论】:

      【解决方案2】:

      o 认为您的代码中有 2 个问题..

      第一:

      使用 传递数据,例如:

      98989794, //<---
      4343545345
      

      第二:

      在您的 C# 中,我可以建议您检查字符串是否为 null 或为空,例如:

       public class MembersController : ApiController
       {
           [HttpGet]
           [Route("api/Members/Find/{ids}")]
           public HttpResponseMessage FindMemebers([FromUri]string[] ids) {
              // CHECK THE ARRAY NOT EMPTY
              if(!ids.Any() || ids.All(xx=> string.isNullOrEmpty(xx))
                  return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "empty params");
      
              using (sampleEntities entities = new sampleEntities()){
                  var numbers = entities.tblmembers
                      .Where(p => ids.Contains(p.identify)  ).ToList();
      
                  if (numbers != null)
                  {
                      return Request.CreateResponse(HttpStatusCode.OK, numbers);
                  }
                  else
                  {
                      return Request.CreateErrorResponse(HttpStatusCode.NotFound, "Member with id: " + ids + " not found");
                  }
               }
           }
       }
      

      【讨论】:

      • 第一个“if”行中似乎缺少一个“)”。它还说“BadRequest()”不起作用(它说它不能转换为 HttpResponse)。我用“CreateErrorResponse”替换了它。我还尝试在 Swagger 中使用逗号“,”插入值,而没有(在 Swagger 中说要在每一行插入值 - 没有提到逗号)。我仍然收到错误消息:'"ExceptionMessage": "Value cannot be null.\r\nParameter name: source", "ExceptionType": "System.ArgumentNullException"'
      • 啊抱歉...只是尝试调用您的方法 GET (或放置 [Route] 装饰)和 [HttpGet] 动词装饰)...并尝试设置 ([FromUri]string[] ids)因为我认为它目前将其视为 QUERYSTRING PARAMS
      • 你能分享一下代码吗?我试过 [Route][HttpGet]public HttpResponseMessage GetAllMembersByIdentifiers(string[] ids) {...BadRequest() 仍然带有红色下划线。我不知道“调用你的方法 GET”到底是什么意思...如果它重命名为 GET,我试过了,BadRequest() 仍然带有下划线。
      • 不,甚至不再显示 MembersController 的服务。所以我注释掉了新行。但我观察到一些有趣的事情。 api 构建的链接对于我猜的数组来说看起来很奇怪:localhost:port/api/Members?ids=97882831302&ids=97882831308
      • 也许最好在 POST 中发送 .. 并将其包装在一个对象中,而不是一个简单的字符串 []
      【解决方案3】:

      解决的方法是:

      1. 添加@federico-scamuzzi 提示的[FromUri]

      2. string[] 替换为List&lt;string&gt;

      所以在代码中是这样的:

      public HttpResponseMessage FindMemebers([FromUri]List<string> ids) { ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-11
        • 2018-04-24
        • 2017-11-14
        • 1970-01-01
        • 1970-01-01
        • 2014-09-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多