Angular $resource POST/PUT to WebAPI 405 Method Not Allowed
Asked Answered
P

1

0

I wasn't able to find helpfull answer to the following problem.
Angular $resource POST/PUT (both) generate 405.0 - Method Not Allowed error on a simple WebAPI calls. Get works just fine. App is an MVC with WebAPI running in IIS 7.5. When I try to run a sample locally - works fine. It's not a CORS issue and Auth was stripped out.

PUT http://portal.local.com/api/products/5 405 (Method Not Allowed)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
  <title>IIS 7.5 Detailed Error - 405.0 - Method Not Allowed</title>
  <style type="text/css">
    <!-- body {
      margin: 0;
      font-size: .7em;
      font-family: Verdana, Arial, Helvetica, sans-serif;
      background: #CBE1EF;
    }
    code {
      margin: 0;
      color: #006600;
      font-size: 1.1em;
      font-weight: bold;
    }
    .config_source code {
      font-size: .8em;
      color: #000000;
    }
    pre {
      margin: 0;
      font-size: 1.4em;
      word-wrap: break-word;
    }
    ul,
    ol {
      margin: 10px 0 10px 40px;
    }
    ul.first,
    ol.first {
      margin-top: 5px;
    }
    fieldset {
      padding: 0 15px 10px 15px;
    }
    .summary-container fieldset {
      padding-bottom: 5px;
      margin-top: 4px;
    }
    legend.no-expand-all {
      padding: 2px 15px 4px 10px;
      margin: 0 0 0 -12px;
    }
    legend {
      color: #333333;
      padding: 4px 15px 4px 10px;
      margin: 4px 0 8px -12px;
      _margin-top: 0px;
      border-top: 1px solid #EDEDED;
      border-left: 1px solid #EDEDED;
      border-right: 1px solid #969696;
      border-bottom: 1px solid #969696;
      background: #E7ECF0;
      font-weight: bold;
      font-size: 1em;
    }
    a:link,
    a:visited {
      color: #007EFF;
      font-weight: bold;
    }
    a:hover {
      text-decoration: none;
    }
    h1 {
      font-size: 2.4em;
      margin: 0;
      color: #FFF;
    }
    h2 {
      font-size: 1.7em;
      margin: 0;
      color: #CC0000;
    }
    h3 {
      font-size: 1.4em;
      margin: 10px 0 0 0;
      color: #CC0000;
    }
    h4 {
      font-size: 1.2em;
      margin: 10px 0 5px 0;
    }
    #header {
      width: 96%;
      margin: 0 0 0 0;
      padding: 6px 2% 6px 2%;
      font-family: "trebuchet MS", Verdana, sans-serif;
      color: #FFF;
      background-color: #5C87B2;
    }
    #content {
      margin: 0 0 0 2%;
      position: relative;
    }
    .summary-container,
    .content-container {
      background: #FFF;
      width: 96%;
      margin-top: 8px;
      padding: 10px;
      position: relative;
    }
    .config_source {
      background: #fff5c4;
    }
    .content-container p {
      margin: 0 0 10px 0;
    }
    #details-left {
      width: 35%;
      float: left;
      margin-right: 2%;
    }
    #details-right {
      width: 63%;
      float: left;
      overflow: hidden;
    }
    #server_version {
      width: 96%;
      _height: 1px;
      min-height: 1px;
      margin: 0 0 5px 0;
      padding: 11px 2% 8px 2%;
      color: #FFFFFF;
      background-color: #5A7FA5;
      border-bottom: 1px solid #C1CFDD;
      border-top: 1px solid #4A6C8E;
      font-weight: normal;
      font-size: 1em;
      color: #FFF;
      text-align: right;
    }
    #server_version p {
      margin: 5px 0;
    }
    table {
      margin: 4px 0 4px 0;
      width: 100%;
      border: none;
    }
    td,
    th {
      vertical-align: top;
      padding: 3px 0;
      text-align: left;
      font-weight: bold;
      border: none;
    }
    th {
      width: 30%;
      text-align: right;
      padding-right: 2%;
      font-weight: normal;
    }
    thead th {
      background-color: #ebebeb;
      width: 25%;
    }
    #details-right th {
      width: 20%;
    }
    table tr.alt td,
    table tr.alt th {
      background-color: #ebebeb;
    }
    .highlight-code {
      color: #CC0000;
      font-weight: bold;
      font-style: italic;
    }
    .clear {
      clear: both;
    }
    .preferred {
      padding: 0 5px 2px 5px;
      font-weight: normal;
      background: #006633;
      color: #FFF;
      font-size: .8em;
    }
    -->
  </style>

</head>

<body>
  <div id="header">
    <h1>Server Error in Application "LITE_PORTAL"</h1>
  </div>
  <div id="server_version">
    <p>Internet Information Services 7.5</p>
  </div>
  <div id="content">
    <div class="content-container">
      <fieldset>
        <legend>Error Summary</legend>
        <h2>HTTP Error 405.0 - Method Not Allowed</h2> 
        <h3>The page you are looking for cannot be displayed because an invalid method (HTTP verb) is being used.</h3> 
      </fieldset>
    </div>
    <div class="content-container">
      <fieldset>
        <legend>Detailed Error Information</legend>
        <div id="details-left">
          <table border="0" cellpadding="0" cellspacing="0">
            <tr class="alt">
              <th>Module</th>
              <td>WebDAVModule</td>
            </tr>
            <tr>
              <th>Notification</th>
              <td>MapRequestHandler</td>
            </tr>
            <tr class="alt">
              <th>Handler</th>
              <td>WebDAV</td>
            </tr>
            <tr>
              <th>Error Code</th>
              <td>0x00000000</td>
            </tr>

          </table>
        </div>
        <div id="details-right">
          <table border="0" cellpadding="0" cellspacing="0">
            <tr class="alt">
              <th>Requested URL</th>
              <td>http://portal.local.com:80/api/products/5</td>
            </tr>
            <tr>
              <th>Physical Path</th>
              <td>C:\_Dev\Applications\liteangular_portal\LiteAngular\api\products\5</td>
            </tr>
            <tr class="alt">
              <th>Logon Method</th>
              <td>Anonymous</td>
            </tr>
            <tr>
              <th>Logon User</th>
              <td>Anonymous</td>
            </tr>

          </table>
          <div class="clear"></div>
        </div>
      </fieldset>
    </div>
    <div class="content-container">
      <fieldset>
        <legend>Most likely causes:</legend>
        <ul>
          <li>The request sent to the Web server used an HTTP verb that is not allowed by the module configured to handle the request.</li>
          <li>A request was sent to the server that contained an invalid HTTP verb.</li>
          <li>The request is for static content and contains an HTTP verb other than GET or HEAD.</li>
          <li>A request was sent to a virtual directory using the HTTP verb POST and the default document is a static file that does not support HTTP verbs other than GET or HEAD.</li>
        </ul>
      </fieldset>
    </div>
    <div class="content-container">
      <fieldset>
        <legend>Things you can try:</legend>
        <ul>
          <li>Verify the list of verbs enabled for the module handler this request was sent to, and ensure that this verb should be allowed for the Web site.</li>
          <li>Check the IIS log file to see which verb is not allowed for the request.</li>
          <li>Create a tracing rule to track failed requests for this HTTP status code. For more information about creating a tracing rule for failed requests, click <a href="http://go.microsoft.com/fwlink/?LinkID=66439">here</a>.</li>
        </ul>
      </fieldset>
    </div>


    <div class="content-container">
      <fieldset>
        <legend>Links and More Information</legend>
        This error means that the request sent to the Web server contained an HTTP verb that is not allowed by the configured module handler for the request.
        <p><a href="http://go.microsoft.com/fwlink/?LinkID=62293&amp;IIS70Error=405,0,0x00000000,7601">View more information &raquo;</a>
        </p>

      </fieldset>
    </div>
  </div>
</body>

</html>

I can make ajax calls to this api methods, so they should be fine. I've tried adding/removing Http ResponseType attributes to them all to no luck. Can some web/angular guru shed some light on this problem? Is it something in IIS? I found this: https://support.microsoft.com/en-us/kb/942051 and this http://www.c-sharpcorner.com/Blogs/47627/wepapi-http-error-405-0-method-not-allowed.aspx But messing with the IIS apphost config seems hackish. And I'm not familiar enough with it to make educated decision. EDIT: My config:

<customHeaders>
  <add name="Access-Control-Allow-Origin" value="*" />
  <add name="Access-Control-Allow-Headers" value="Content-Type, Accept, Authorization" />
  <add name="Access-Control-Allow-Credentials" value="true" />
  <add name="Access-Control-Allow-Methods" value="POST,GET,PUT,DELETE,OPTIONS" />
  <add name="Access-Control-Max-Age" value="1728000" />      
</customHeaders>

      

Thanks in advance!

P.S. It looks like the problem has to do with WebDAVModule: Notification MapRequestHandler Handler WebDAV Error Code 0x0000000

Anyone knows what it might be, though? Anyone?...

Prettify answered 17/7, 2015 at 19:29 Comment(4)
Are you sure the request isn't sending an OPTIONS request instead of PUT or POST? My guess would be that's the case, and you haven't setup CORS properly. A quick glance at the browser console would have provided you with a very detailed error message if this is the case.Gereld
Please check this: #20260709Mackmackay
@Kevin, thanks for a quick response, however I'm pretty positive it's not cors - it's an MVC 1-project app and running on the same site. I've edited post to include the complete error.Prettify
@Prettify Ok, have a good fridayMackmackay
P
3

It turned out removing WebDAV handler and WebDAVModule took care of the problem:

<handlers>
  <remove name="WebDAV" />
</handlers>
<modules runAllManagedModulesForAllRequests="true">
  <remove name="WebDAVModule" />
</modules>
Prettify answered 25/11, 2015 at 18:48 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.