2016-07-28 14 views
2

私は問題を抱えていますが、同じトピックに対する答えはたくさんありましたが、本当にうまくいきませんでした。私はWebAPIプロジェクトとMVCを持っています。アンギュラプロジェクトからWebApi + AngularJS:405 Method Not Allowed

は、私はこのような何かを投稿しようとしている:

var promise = $http.post("http://localhost:55692/api/users", user) 
       .success(function (data) { 
        debugger; 
        console.log(data); 
        return data; 
       }); 

      $http(
     { 
      url: "http://localhost:55692/api/users", 
      method: "POST", 
      headers: { 'Content-Type': 'application/json' }, 
      data: { "user": user } 
     }) 
      .then(function (response) { 
       debugger; 
       console.log(data); 
       return data; 
      }); 
      return promise; 

あなたは、私はケースに二度同じAPIを呼んでいる表示された場合には、角度のことだが、私には、そうではありません..

私は私のAPIプロジェクトでこのコントローラを持っている:

[RoutePrefix("api/users")] 
    public class ValuesController : ApiController 
    { 
     [Route("")] 
     [HttpPost] 
     public HttpResponseMessage LoginOrRegister(RegisterUserViewModel user) 
     { 
      HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, true); 
      return response; 
     } 
    } 

これは私が持っている応答である:

Response

そして、これは私のWebConfigある

<system.webServer> 
    <handlers> 
     <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
     <remove name="OPTIONSVerbHandler" /> 
     <remove name="TRACEVerbHandler" /> 
     <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 
    </handlers> 
    <!--<validation validateIntegratedModeConfiguration="false" />--> 
    <httpProtocol> 
     <customHeaders> 
     <add name="Access-Control-Allow-Origin" value="*" /> 
     <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept, X-Token, X-Acting-As" /> 
     <add name="Access-Control-Allow-Methods" value="GET,POST,PUT,DELETE,OPTIONS,PATCH" /> 
     </customHeaders> 
    </httpProtocol> 
    </system.webServer> 

EDIT 私WebApiConfigは、次のようになります。

public static class WebApiConfig 
    { 
     public static void Register(HttpConfiguration config) 
     { 
      // Attribute routing enabled 
      config.MapHttpAttributeRoutes(); 

      // Convention-based routing enabled 
      config.Routes.MapHttpRoute(
       name: "DefaultApi", 
       routeTemplate: "api/{controller}/{id}", 
       defaults: new { id = RouteParameter.Optional } 
      ); 

      config.Formatters.JsonFormatter.SerializerSettings.NullValueHandling = NullValueHandling.Include; 

      // Uncomment the following line of code to enable query support for actions with an IQueryable or IQueryable<T> return type. 
      // To avoid processing unexpected or malicious queries, use the validation settings on QueryableAttribute to validate incoming queries. 
      // For more information, visit http://go.microsoft.com/fwlink/?LinkId=279712. 
      //config.EnableQuerySupport(); 

      // To disable tracing in your application, please comment out or remove the following line of code 
      // For more information, refer to: http://www.asp.net/web-api 
      config.EnableSystemDiagnosticsTracing(); 
     } 
    } 

最後に、 "奇妙な" 唯一のことは、私はIISExpressを使用しているということですこれらは私のプロジェクトの第一歩です。

誰か何が起こっているのか知っていますか?

+0

'WebApiConfig.cs'の' Register'メソッドはどのように見えますか?また、一般的なアドバイスのように、コントローラの名前と一致しないルートプレフィックスを作成することは避けています。プロジェクトが大きくなると、コントローラ名がルートプレフィックスと一致しないときにコードをナビゲートすることがますます不満になります。あなたがチームに取り組んでいる場合は、さらにそうです。 – Lex

+0

そこに、私はそれを加えました。そこにポイントがありますが、正直なところ、クロスドメインのものを動作させるためのテストコントローラーだけです。 –

答えて

1

private headers = new Headers({ 'Content-Type': 'application/json' }); 
private options = new RequestOptions({ headers: this.headers }); 

return this.http.post(this.baseUserUrl + '/Save', JSON.stringify(user), this.options) 
      .toPromise() 
      .then(response => response) 
      .catch((error) => Promise.reject(error)); 

を以下にコンテンツタイプを渡す必要があるとAPI層で

public async Task<HttpResponseMessage> Save(UserDto user) 

または

public static class WebApiConfig 
    { 
     public static void Register(HttpConfiguration config) 
     { 
      // Attribute routing enabled 
      config.MapHttpAttributeRoutes(); 

      // Convention-based routing enabled 
      config.Routes.MapHttpRoute(
       name: "DefaultApi", 
       routeTemplate: "api/{controller}/{id}", 
       defaults: new { id = RouteParameter.Optional } 
      ); 

      config.Formatters.JsonFormatter.SerializerSettings.NullValueHandling = NullValueHandling.Include; 
      config.MessageHandlers.Add(new PreflightRequestsHandler()); 
} 
    } 

プリフライトクラス:

public class PreflightRequestsHandler : DelegatingHandler 
    { 
     protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
     { 
      if (request.Headers.Contains("Origin") && request.Method.Method.Equals("OPTIONS")) 
      { 
       var response = new HttpResponseMessage { StatusCode = HttpStatusCode.OK }; 
       // Define and add values to variables: origins, headers, methods (can be global)    
       response.Headers.Add("Access-Control-Allow-Headers", "accept, content-type"); 

       var tsc = new TaskCompletionSource<HttpResponseMessage>(); 
       tsc.SetResult(response); 
       return tsc.Task; 
      } 
      return base.SendAsync(request, cancellationToken); 
     } 

    } 

私はこれが他の誰にも役立つことを願っています!

0

405は、リクエストデータタイプがサポートされていない場合に表示されます。あなたはまあ闘争の多くの後に、これはそれが...

public HttpResponseMessage Save(UserDto user) 
+0

APIとAngularで作業する別のプロジェクトがあり、そのすべてを行う必要はありませんでした。実際、そういうわけで、このエラーは私にとってはすごく奇妙です。 –

関連する問題