我对Web不太熟悉。这是我的问题。我从我的Windows窗体应用程序发送一个Json序列化对象。对象是一个实体表。当我执行get响应时,它返回一个500服务器错误。基本上,我计划在一个控制器中有多个post方法,但我可能做得不对。所以我需要你们指导我做错了什么。
这是我的主计长:
[ResponseType(typeof(HttpWebResponse)), HttpPost, ActionName("MerchandiseApi")]
public HttpResponseMessage PostMain(IList<IMF_Main> mainFromConsolidator)
{
if (!ModelState.IsValid)
return Request.CreateResponse(HttpStatusCode.BadRequest, 2);
using (var anthill = new AnthillConsolidatorEntities())
{
var main = new IMF_Main();
foreach (var item in mainFromConsolidator)
{
main.BrandID = item.BrandID;
main.ItemID = item.ItemID;
main.CategoryID = item.CategoryID;
main.SubCategoryID = item.SubCategoryID;
main.ClassID = item.ClassID;
main.GenderID = item.GenderID;
main.CoaID = item.CoaID;
main.SubCoaID = item.SubCoaID;
main.First_SRP = item.First_SRP;
main.Current_SRP = item.Current_SRP;
main.Previous_SRP = item.Previous_SRP;
main.isSenior = item.isSenior;
main.isActive = item.isActive;
main.DateCreated = item.DateCreated;
anthill.IMF_Main.Add(main);
anthill.SaveChanges();
}
}
return Request.CreateResponse(HttpStatusCode.OK, 1);
}这是我的WebApiConfig:
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "MerchandiseApi",
routeTemplate: "api/{controller}/{action}"
);
}这里是构建Uri的地方:我还有两个表要发送,但我将从这里开始。这将转到我的第一个Post方法到服务器
var jsonMain = JsonConvert.SerializeObject(consolidatorEntities.IMF_Main, Formatting.None);
HttpPost("http://localhost:50826/api/Merchandise/PostMain", jsonMain) == 1.ToString()
public string HttpPost(string uri, string json)
{
string content = "";
try
{
var request = (HttpWebRequest)WebRequest.Create(uri);
request.Method = "POST";
request.Accept = "application/json";
request.ContentType = "application/json";
byte[] bodyBytes = Encoding.UTF8.GetBytes(json);
request.GetRequestStream().Write(bodyBytes, 0, bodyBytes.Length);
request.GetRequestStream().Close();
var response = (HttpWebResponse)request.GetResponse();
var sr = new StreamReader(response.GetResponseStream(), Encoding.GetEncod
ing("UTF-8"));
content = sr.ReadToEnd();
sr.Close();
}
catch (Exception ex)
{
MessageBox.Show("Error sending data to Anthill \nException: " + ex, "Monytron - Consolidator", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
return content;
}发布于 2015-11-01 21:24:50
问题
主要问题是你的路线。路由将按顺序进行检查,因此,当您向http://localhost:50826/api/Merchandise/PostMain发送请求时,您将按顺序排列这些路由:
"api/{controller}/{id}""api/{controller}/{action}"所以第一条路线是匹配的:
PostMain方法是使用[HttpPost]的唯一操作,那么mainFromConsolidator在foreach循环中将为null,您将收到一个导致500个错误的NullReferenceException。InvalidOperationExpception,其中包含“找到多个与请求匹配的操作”消息,从而导致500个错误。另一个问题是,您使用的是ActionName("MerchandiseApi"),但没有发布到该操作。
溶液
您可以使用多种解决方案。作为一种选择,您只能定义一条路由:
"api/{controller}/{action}/{id}"通过这种方式,您可以创建一个包含以下操作的控制器:
public class SomeController
{
// matches GET /api/some/action1
[HttpGet]
public HttpResponseMessage Action1()
// matches GET /api/some/action2/5
[HttpGet]
public HttpResponseMessage Action2(int id)
// matches POST /api/some/action3
[HttpPost]
public HttpResponseMessage Action3(SomeType someParameter)
// matches POST /api/some/action4
[HttpPost]
public HttpResponseMessage Action4(SomeType someParameter)
}无论如何,如果您决定定义多个路由,请注意路由将按顺序匹配,如果使用ActionName属性,则在url中使用该名称来调用该操作。
https://stackoverflow.com/questions/33460754
复制相似问题