C# 在传递单个字符串参数时从MVC5控制器调用Web API Post方法

C# 在传递单个字符串参数时从MVC5控制器调用Web API Post方法,c#,asp.net,json,asp.net-mvc,asp.net-web-api2,C#,Asp.net,Json,Asp.net Mvc,Asp.net Web Api2,因此,我正在调试我的应用程序,并在MVC应用程序旁边运行一个web API。我只是试图在传递字符串参数的同时调用WebAPI post方法 一般资料: 使用.NET Framework 4.5.2 希望以JSON形式发送字符串参数并以JSON形式接收HttpResponseMessage WEB API项目控制器: 这是我尝试调用的web api方法 [HttpPost] public HttpResponseMessage CreateStandardSchematic(strin

因此,我正在调试我的应用程序,并在MVC应用程序旁边运行一个web API。我只是试图在传递字符串参数的同时调用WebAPI post方法

一般资料:

  • 使用.NET Framework 4.5.2

  • 希望以JSON形式发送字符串参数并以JSON形式接收HttpResponseMessage

  • WEB API项目控制器:

    这是我尝试调用的web api方法

    [HttpPost]
        public HttpResponseMessage CreateStandardSchematic(string modelToCreate)
        {
            string check = _eplanConnectionService.CreateProject(modelToCreate, "");
            var NewProjectLog = new NewProjectLogDTO
            {
                ErrorMessage = check == "Success" ? "Success" : check,
                PassFail = check == "Success" ? "Pass" : "Fail",
                MaterialNumber = modelToCreate,
            };
            return Request.CreateResponse(System.Net.HttpStatusCode.OK, NewProjectLog);
        }
    
    MVC控制器:

    这是我的MVC5项目,我只是尝试调用上面的WebAPI方法

    public JsonResult CreateStandardSchematics(List<MaterialViewModel> listOfMaterials, string clientId)
        {
            using (var client = new HttpClient())
            {
                //using JSON
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                var stringContent = new StringContent(listOfMaterials[0].Material);//passing material number as string
    
                //This is the portion I am unsure about. I see a lot of online suggestions saying 
                //to use PostAsJsonAsync but I do not have access to the libraries. I would prefer 
                //to use PostAsync() but am unsure how to format the correct query string I believe?
                var responseTask = client.PostAsync("http://localhost:44344/api/Project?modelToCreate=", stringContent);
                responseTask.Wait();
    
                var result = responseTask.Result;
                if (result.IsSuccessStatusCode)
                {
                    var readTask = result.Content.ReadAsStringAsync().Result;
                    //Deserialize object
                    var deserialized = JsonConvert.DeserializeObject<List<NewProjectLogViewModel>>(readTask);
                }
                else //web api sent error response 
                {
                    //log response status here..
                }
            }
            //Other stuff
        }
    
    这现在是我的MVC控制器:

    我简化了这一点,这样就没有那么多的垃圾给每个人看了。我开始使用一个对象,而不是一个名为MaterialViewModel的简单字符串(请参见下面的类):

    我的检查现在显示在过帐之前正在生成以下字符串:


    谢谢大家!

    通常HTTP POST请求假定请求主体包含参数。在您的情况下,如果要通过查询字符串传递参数,必须在web API中使用[FromUri]属性,如下所示

    public HttpResponseMessage CreateStandardSchematic([FromUri]string modelToCreate)
    
    要将有效字符串传递给参数,只需将值作为查询字符串传递,如下所示

     var responseTask = client.PostAsync(String.Format("http://localhost:44344/api/Project?modelToCreate={0}",listOfMaterials[0].Material);
    

    由于发布的信息很少,很难确定到底发生了什么,但我有一些话要说,你可以试试

  • 看起来您的POST方法没有使用任何主体,所以如果您觉得合适的话,可以将其转换为GET

  • 使用随机端口删除硬编码URI。当您运行/调试Web API项目时,它会时不时地更改。如果要硬编码,请在“属性”窗口中设置静态端口

  • 您实际上并不需要此代码

    var check = stringContent.ReadAsStringAsync().GetAwaiter().GetResult();
    
  • 如果不是查询字符串参数,那么调用POST URI的方式也可以。如果希望它是一个查询字符串,您的URI需要反映这一点


  • 看看坦加杜赖在他的第二行中发布了什么。传递正文是您现在正在做的事情,而不是查询参数。

    我如何在正文中传递数据?如果您想在请求正文中以json的形式发布数据,请参阅本文。检查返回该结果,因为您正在输入。您应该查看来自Web API控制器的检查,而不是来自客户端的检查。我更希望将其传递到正文中。这就是我想弄明白的。忽略第一部分,再往下看我的编辑。我把我的地址改成了正确的地址。如果你想把它放在身体里,你已经在你的邮寄电话中这样做了。您唯一需要更改的是Web API控制器的操作。您不再获得查询字符串。那你就得看你的身体了。如果你检查了我的编辑,我添加了[From Body]标记,但是我的API仍然没有到达,并且超时了,那么你的API就可以正常工作了?我确信localhost是正确的,每次都是一样的。这更像是对atm概念的测试。只看了你的编辑。我可以建议两种选择:使用Postman或Fiddler将请求通过这个主体发布到该URI。如果您的API受到攻击,那么您的MVC需要更改。第二,尝试使用一个简单的数据类型,比如string,而不是视图模型?这是让我困惑的部分。它通过使用视图模型显示,并添加相应的模型来创建:“我的值”。我会和邮差一起测试,看看发生了什么。
    public class MaterialViewModel
    {
        public string Material { get; set; }
    }
    
    public HttpResponseMessage CreateStandardSchematic([FromUri]string modelToCreate)
    
     var responseTask = client.PostAsync(String.Format("http://localhost:44344/api/Project?modelToCreate={0}",listOfMaterials[0].Material);
    
    var check = stringContent.ReadAsStringAsync().GetAwaiter().GetResult();