在ASP.NET MVC API中发布对象

时间:2013-02-21 14:39:22

标签: asp.net-mvc asp.net-web-api asp.net-mvc-routing asp.net-web-api-routing

我有一个 MVC应用程序,它包含一个简单的 mvc 4项目中的Web应用程序。 此外,我有一个 Windows应用程序,这是在其他Windows应用程序项目中的Web应用程序的Windows执行。

Windows应用程序使用 MVC API ,并通过resthelper类以TfsApiController的名称调用MVC Web应用程序控制器。

除了post方法之外,所有方法都有效。我想将一个对象发布到tfsapi控制器。

rest helper class的post方法:

public void Post(T targetObject)
{
    if (targetObject == null)
    {
        throw new System.ArgumentNullException("targetObject");
    }

    //Get formatting details.
    System.Net.Http.Formatting.MediaTypeFormatter myFormatter = new XmlMediaTypeFormatter();

    myUrlSuffix = "api/tfsapi";

    //Make the call.
    var result = this.MainHttpClient.PostAsync(myUrlSuffix, targetObject, myFormatter).Result.Content.ReadAsAsync<T>().Result;
}

我的TfsApiController方法:

public void PostPreActivity(PreActivity preActivity)
{
}

路由:

RouteTable.Routes.MapHttpRoute(
name: "PostPreActivity",
routeTemplate: "api/tfsapi/Post",
defaults: new { id = RouteParameter.Optional }
).RouteHandler = new SessionRouteHandler();

我浪费了很多时间,但我不知道是什么问题。

更新:

这是我的所有工作路线:

RouteTable.Routes.MapHttpRoute(
         name: "GetWorkItemsByProject",
         routeTemplate: "api/{controller}/{action}/{projectID}",
         defaults: new { controller = "tfsapi", action = "GetWorkItems", projectID = UrlParameter.Optional }
     ).RouteHandler = new SessionRouteHandler();;

RouteTable.Routes.MapHttpRoute(
         name: "ActionWebApiRoute",
         routeTemplate: "api/{controller}/{action}/{id}",
         defaults: new { id = RouteParameter.Optional }
     ).RouteHandler = new SessionRouteHandler();

RouteTable.Routes.MapHttpRoute(
         name: "DefaultApi",
         routeTemplate: "api/{controller}/{id}",
         defaults: new { id = RouteParameter.Optional }
     ).RouteHandler = new SessionRouteHandler();

1 个答案:

答案 0 :(得分:0)

您的路线似乎不正确,请将其更改为如下所示,然后重试:

config.Routes.MapHttpRoute(
            name: "TfsApiRoute",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
顺便问一下,你在使用SessionRouteHandler做什么?

[上述更新后更新]

您需要更改以下代码才能完全包含操作名称: myUrlSuffix =“api / tfsapi / PostPreActivity ”;

我认为这是因为根据您更新的路线,当'api / tfsapi'这样的请求到来时,它会尝试与名为“GetWorkItemsByProject”的第一条路线匹配,因为'action'不是可选的在这里,你可能看到404找不到。