2017-11-06 12 views
-1

私は.netコアWeb APIプロジェクトとこのブロックで悪夢を与えています。私は、ionic-angから.netコアプロジェクトへのリクエストを送信しようとしています。 GET要求は完全に機能しています。しかし、POST要求はありません。私がクロームでプロジェクトをテストしようとすると、OPTIONSリクエストに対してnet :: ERR_CONNECTION_RESETと表示されます。実際のPOSTリクエスト前にChromeがプリフライトのOPTIONSリクエストを送信することを理解しています。しかし、それは問題です。私はこのようなミドルウェアでOPTIONSリクエストを処理しようとしましたChromeからの.netコアWeb APIへのPOSTリクエストは機能しません。

 
    

    using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Threading.Tasks; 
    using Microsoft.AspNetCore.Builder; 
    using Microsoft.AspNetCore.Http; 
    using Microsoft.AspNetCore.Hosting; 

    namespace A.Middlewares 
    { 
     public class OptionsMiddleware 
     { 
      private readonly RequestDelegate _next; 
      private IHostingEnvironment _environment; 

      public OptionsMiddleware(RequestDelegate next, IHostingEnvironment environment) 
      { 
       _next = next; 
       _environment = environment; 
      } 

      public async Task Invoke(HttpContext context) 
      { 
       this.BeginInvoke(context); 
       await this._next.Invoke(context); 
      } 

      private async void BeginInvoke(HttpContext context) 
      { 
       if (context.Request.Method == "OPTIONS") 
       { 
        context.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "http://localhost:8100" }); 
        context.Response.Headers.Add("Access-Control-Allow-Headers", new[] { "Origin, X-Requested-With, Content-Type, Accept" }); 
        context.Response.Headers.Add("Access-Control-Allow-Methods", new[] { "GET, POST, PUT, DELETE, OPTIONS" }); 
        context.Response.Headers.Add("Access-Control-Allow-Credentials", new[] { "true" }); 
        context.Response.StatusCode = 200; 
        await context.Response.WriteAsync("OK"); 
       } 
       else 
       { 
        context.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "http://localhost:8100" }); 
        context.Response.Headers.Add("Access-Control-Allow-Headers", new[] { "Origin, X-Requested-With, Content-Type, Accept" }); 
        context.Response.Headers.Add("Access-Control-Allow-Credentials", new[] { "true" }); 
       } 

      } 
     } 

     public static class OptionsMiddlewareExtensions 
     { 
      public static IApplicationBuilder UseOptions(this IApplicationBuilder builder) 
      { 
       return builder.UseMiddleware(); 
      } 
     } 
    } 

 

しかし、まだそれは役に立ちません。その周りに何かのトリックがあれば、私を教えて!

+0

ホスティングウェブページのURLはどれですか? POSTしようとしているURLは何ですか? – mjwills

答えて

1

ChromeがOPTIONSを送信している理由は、.netサーバーが投稿を行っているウェブページ(コンポーネント)よりも別のURL(ドメイン)にあるからです。これは、CORS - Cross-Origin Request Sharingを使用してCross Originタイプの攻撃からあなたを守るためです。

あなたStartup.csでCORSを有効にすることができます。Microsoft.AspNetCore.Cors

public void Configure(IApplicationBuilder app, IHostingEnvironment env) 
     { 
      // All the other things here 
      if (env.IsDevelopment()) // For development only, we allow CORS from anywhere. 
      { 
       app.UseCors(builder => builder.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin().AllowCredentials().Build()); 
      } 
     } 

あなたはこのパッケージをインストールする必要があります。

さらにいくつかの読書:そのためにhttps://docs.microsoft.com/en-us/aspnet/core/security/cors

+0

これは上記の私のコードと同じ機能かもしれません。私は問題がヘッダーに関係していないとは思わない。しかし、それはoptionsメソッドを処理することかもしれません。 OPTIONSメソッドに200を返し、次のリクエストに移動するにはどうすればよいですか?それがトリックです。上記の私のコードを確認してください。 –

+0

CORSに200を返すだけでは不十分です。許可されたメソッドと許可されたヘッダーを指定する必要があります。だから、自分でコードするよりも、マイクロソフトが提供するライブラリを使う方が簡単です... – zaitsman

+0

男、あなたはポイントを持っています。私はあなたのコードを自分のStartup.csの中に入れましたが、まだそれを修正しません。上のコードでは、すでに許可されているメソッドとヘッダーを指定していることがわかります。とにかく、ありがとうございました。 –

-1

サーバーにクロスオリジン・リクエストを送ったChromeブラウザでは、1つの拡張をインストールする必要があります。 Urlは以下の通りです。

https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi?hl=en

+0

他の多くのクロスオリジンリクエストの拡張も他のブラウザでも利用可能です... – PravinSanghani

+0

そうすることはブラウザのセキュリティを損なうことにちょうど注意してください – zaitsman

+0

はい、私はそれを知っていますが、多くの拡張機能はオフスイッチでも提供していますその時私たちはスイッチ上のイオンまたは任意のクロスブラウザの要求の任意のものをテストする。 – PravinSanghani

関連する問題