【问题标题】:Posting object in ASP.NET MVC API在 ASP.NET MVC API 中发布对象
【发布时间】:2013-02-06 22:30:16
【问题描述】:

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

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

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

rest辅助类的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();

【问题讨论】:

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


    【解决方案1】:

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

    config.Routes.MapHttpRoute(
                name: "TfsApiRoute",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
    

    顺便问一下,你用 SessionRouteHandler 做什么?

    [以上帖子更新后更新]

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

    我相信这是因为根据您更新的路由,当像“api/tfsapi”这样的请求出现时,它会尝试与名为“GetWorkItemsByProject”的第一条路由匹配,因为“action”不是可选的在这里,您可能看到 404 not found。

    【讨论】:

    • 感谢您的帮助,但是这个路由是我的默认路由。我已经更新了帖子。
    • 我已根据您的路由更新更新了我上面的帖子。让我知道这是否有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    • 2016-06-05
    • 2019-08-06
    • 2015-12-04
    相关资源
    最近更新 更多