C# 在传递单个字符串参数时从MVC5控制器调用Web API Post方法
因此,我正在调试我的应用程序,并在MVC应用程序旁边运行一个web API。我只是试图在传递字符串参数的同时调用WebAPI 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
[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);
由于发布的信息很少,很难确定到底发生了什么,但我有一些话要说,你可以试试
var check = stringContent.ReadAsStringAsync().GetAwaiter().GetResult();
看看坦加杜赖在他的第二行中发布了什么。传递正文是您现在正在做的事情,而不是查询参数。我如何在正文中传递数据?如果您想在请求正文中以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();