为什么我的Web API仅在Put Put?

时间:2015-04-30 14:55:12

标签: c# asp.net

我在ASP.NET中编写了一个Web API,我在一个调用Web API的桌面应用程序中编写了一个测试方法。测试方法插入新记录,更新记录,然后删除记录。插入成功,我可以在数据库表中看到新记录。删除方法也有效,记录将从表中删除。更新方法失败,并显示以下错误消息:

响应状态代码不表示成功:405(方法不允许)。

我使用Visual Studio的常规过程创建了Web API,但我没有修改它构建的框架代码。我创建了一个名为WebSave的实用程序函数(如下所示)来处理插入和更新函数。我不明白为什么更新的内容有任何不同。希望有人能告诉我。

    private void SaveData_Test()
    {
        string sRequestURI = "http://localhost:49625/api/tipshare_def";
        int iStoreNo = 40004;
        tipshare_def oTipShareDef = new tipshare_def() { storeno = iStoreNo, tipshare_type = 1, total_bar_share = (decimal)1.0, food_bar_share = (decimal)0.6, alc_bar_share = (decimal)0.4, job_exclude1 = 1, job_exclude2 = 1, job_exclude3 = 0 };
        Utilities.WebSave(sRequestURI, oTipShareDef, typeof(tipshare_def), true);
        oTipShareDef.food_bar_share = (decimal)0.7;
        oTipShareDef.alc_bar_share = (decimal)0.3;
        Utilities.WebSave(sRequestURI, oTipShareDef, typeof(tipshare_def), false);
        string sRequestURI2 = "http://localhost:49625/api/tipshare_def/" + iStoreNo.ToString("0");
        Utilities.WebDelete(sRequestURI2);
    }

        public static async Task WebSave(string sRequestURI, object oRecord, Type tRecordType, bool bNewRecord)
    {
        try
        {
            HttpClient oHttpClient = new HttpClient();
            if (bNewRecord == true)
            {
                HttpResponseMessage oResponse = await oHttpClient.PostAsJsonAsync(sRequestURI, oRecord);
                oResponse.EnsureSuccessStatusCode();
                HttpStatusCode oStatus = oResponse.StatusCode;
                string sStatus = oStatus.ToString();
            }
            else
            {
                HttpResponseMessage oResponse = await oHttpClient.PutAsJsonAsync(sRequestURI, oRecord);
                oResponse.EnsureSuccessStatusCode();
                HttpStatusCode oStatus = oResponse.StatusCode;
                string sStatus = oStatus.ToString();
            }
        }
        catch (Exception oException)
        {
            HandleError("WebSave", oException);
        }
    }

//这是相关的Web API代码:

    // PUT: api/tipshare_def/5
    [ResponseType(typeof(void))]
    public async Task<IHttpActionResult> Puttipshare_def(int id, tipshare_def tipshare_def)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        if (id != tipshare_def.storeno)
        {
            return BadRequest();
        }

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

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

        return StatusCode(HttpStatusCode.NoContent);
    }

    // POST: api/tipshare_def
    [ResponseType(typeof(tipshare_def))]
    public async Task<IHttpActionResult> Posttipshare_def(tipshare_def tipshare_def)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        db.tipshare_def.Add(tipshare_def);

        try
        {
            await db.SaveChangesAsync();
        }
        catch (DbUpdateException)
        {
            if (tipshare_defExists(tipshare_def.storeno))
            {
                return Conflict();
            }
            else
            {
                throw;
            }
        }

        return CreatedAtRoute("DefaultApi", new { id = tipshare_def.storeno }, tipshare_def);
    }

2 个答案:

答案 0 :(得分:4)

在这种情况下,您的参数不匹配。您的PUT请求中有一个Id但在POST中没有。

作为一般规则,如果仅在少数动词(通常是PUT和DELETE)上收到405响应,则需要使用以下更改之一更新web.config:

<system.webServer>
    <handlers>
        <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." 
            verb="GET,HEAD,POST,DEBUG,PUT,DELETE" 
            type="System.Web.Handlers.TransferRequestHandler"              
            preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
</system.webServer>

WEBDAV也可能会干扰您的请求。以下将删除它。

<modules runAllManagedModulesForAllRequests="true">
    <remove name="WebDAVModule"/>
</modules>

答案 1 :(得分:0)

我从以下两个原因之一得到了这个错误:

  1. 不允许使用HTTP动词。
  2. 对此的修正由David L发布。

    1. 未启用该服务的跨源资源共享。
    2. 对此的解决方案可能会稍微复杂一些,因为它取决于您使用的Web API版本以及您正在使用的ASP.NET版本。 Microsoft提供了一篇关于在ASP.NET Web API 2中启用跨域请求的文章,这是一个很好的起点:

      http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api