WebApi OData只能POST和GET实体

时间:2014-05-02 16:15:08

标签: c# asp.net-web-api

我使用WebApi OData创建了一个简单的CRUD应用程序。我一直在使用Fiddler 2的Composer选项卡来测试服务,无论我做什么,我都会从本地IIS服务器获得HTTP 404响应。如上所述, POST 请求有效:

  

http://mymachine/Service.Facade.Reports/odata/Reports

     

User-Agent:Fiddler

     

Content-Type:application / json

     

主持人:localhost

     

内容长度:1373

     

{     “名称”: “报告......”, “集团”: “Hhowd444”, “ReportLayoutID”:8270, “DatabaseInstanceID”:1042   }

所以我试过了:

  

但是,将网址更改为:>   http://mymachine/Service.Facade.Reports/odata/Reports(8270)和   执行 PUT 无法正常工作

PUT导致404错误。我试图调试和跟踪服务的尝试没有取得任何进展。

在WebApiConfig类中:

public static void Register(HttpConfiguration config)
{
    ODataModelBuilder builder = new ODataConventionModelBuilder();
    builder.EntitySet<ReportLayout>("Reports");
    builder.EntitySet<ReportLayoutData>("ReportLayoutData");
    builder.EntitySet<DatabaseInstance>("DataSources");
    builder.EntitySet<DataSourceObject>("DataSourceObject");

    config.Routes.MapODataRoute("odata", "odata", builder.GetEdmModel());

    config.MapHttpAttributeRoutes();

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

来自控制器的帖子和投放:

public async Task<IHttpActionResult> Post(ReportLayout reportlayout)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    db.Reports.Add(reportlayout);
    db.ReportsData.AddRange(reportlayout.LayoutData);
    await db.SaveChangesAsync();

    return Created(reportlayout);
}

public async Task<IHttpActionResult> Put([FromODataUri] int key, ReportLayout reportlayout)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    if (key != reportlayout.ReportLayoutID)
    {
        return BadRequest();
    }

    db.Entry(reportlayout).State = EntityState.Modified;

    try
    {
        await db.SaveChangesAsync();
    }
    catch (DbUpdateConcurrencyException)
    {
        if (!ReportLayoutExists(key))
        {
            return NotFound();
        }
        else
        {
            throw;
        }
    }

    return Updated(reportlayout);
}

1 个答案:

答案 0 :(得分:0)

最后,代码不是问题,而是我的IIS 7.5服务器的配置。

要解决,请转到:

  1. IIS管理器
  2. 处理程序映射
  3. 找到ExpresslessUrlHandler ...条目x 3
  4. 右键单击,编辑
  5. 选择请求限制
  6. 点击动词标签
  7. 添加额外动词或只选择All Verbs
  8. 在经历了一些痛苦和痛苦之后,一切都在发挥作用!