2016-03-21 16 views
1

Web API 2を既存のVB aspx Webフォームプロジェクトに追加しました。私は標準のWeb APIプロジェクトのようにWebApiConfigを持つapp_startフォルダを持っていないので、ルーティングはグローバルasax application_startに入りました。私は、しかし、私は私が受け取るjqueryのAJAXを通じて自分のWeb APIへの呼び出しを行っているHTMLページを実行しようとするたびにCORSaspx web api 2 hybridにcorsを追加する

Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs) 
     ' Fires when the application is started 

     RouteTable.Routes.MapHttpRoute(
      name:="DefaultApi", 
      routeTemplate:="api/{controller}/{id}", 
      defaults:=New With {.id = RouteParameter.Optional} 
     ) 

    Dim cors = New EnableCorsAttribute("*", "*", "*") 
    GlobalConfiguration.Configuration.EnableCors(cors) 

    End Sub 

を有効にしようとしたaddがナゲットパッケージマネージャからCORSをダウンロードしました。

Cross-Origin Request Blocked: The Same Origin Policy 
disallows reading the remote resource at https://xxxxx/specialdev/api/WSFobOrigin. 
(Reason: CORS header 'Access-Control-Allow-Origin' missing) 

私は、私が各コントローラーにも同様にそれを追加しようとしています。ここで

Public Class WSFobOriginController 
    Inherits ApiController 
    <EnableCors("*", "*", "*")> 
    <HttpGet> 
    <CustomAuthentication> 
    <Authorize(Roles:="WebService")> 
    Public Function logon() As IHttpActionResult 
     Return Ok("successfully loggon on") 
    End Function 

AJAX呼び出し(私はクロスドメインでとせずに、それを試してみました:真)さ

this.logon = function() { 
       $('#signin').prop('disabled', true); 
       $.ajax({ 
        url: "https://xxxxxxxx.dir.ad.dla.mil/specialdev/api/WSFobOrigin", 
        type: "GET", 
        datatype: "json", 
        crossDomain: true, 
        beforeSend: function (xhr) { 
         $('#logonSpinner').show(); 
         xhr.setRequestHeader("Authorization", "Basic " + btoa(self.userName() + ":" + self.password())); 
        }, 
        success: function (data) { 
         self.loggedon(true); 
        }, 
        error: function (xhr, status, error) { 
         $('#signin').prop('disabled', false); 
         $('#logonSpinner').hide(); 
         $('#logonError').show(); 
         self.logOnErrorMessage("Status: " + xhr.status + " Message: " + xhr.statusText) 
        } 
       }); 

      } 

はちょうど私には少し奇妙であるもう一つの事に気づきました。私はローカル(ビジュアルスタジオを介して)Web APIを実行し、ローカルURLに私のクライアントのjqueryのajax呼び出しを変更するときに動作します。

URL Protocol Method Result Type Received Taken Initiator Wait‎‎ Start‎‎ Request‎‎ Response‎‎ Cache read‎‎ Gap‎‎ 
http://localhost:52851/api/WSFobOrigin HTTP OPTIONS 200  420 B 31 ms CORS Preflight 0 16 0 15 0 203 

URL Protocol Method Result Type Received Taken Initiator Wait‎‎ Start‎‎ Request‎‎ Response‎‎ Cache read‎‎ Gap‎‎ 
http://localhost:52851/api/WSFobOrigin HTTP GET 200 application/json 447 B 218 ms XMLHttpRequest 16 15 203 0 0 0 

が、私はプリフライトは中止され、タイプは、もはやOPTIONSを言わない、それはいくつかの他の記事

URL Protocol Method Result Type Received Taken Initiator Wait‎‎ Start‎‎ Request‎‎ Response‎‎ Cache read‎‎ Gap‎‎ 
https://xxxxxxx.dir.ad.dla.mil/specialdev/api/WSFobOrigin HTTPS  (Aborted)  0 B 47 ms CORS Preflight 0 47 0 0 0 796 

nullの実際のサーバーを指すようにクライアントを変更私が試したフィルタを追加することを提案しましたが、どちらもうまくいかないようです。

I mportsのSystem.Web.Http.Filters

Public Class AllowCors 
    Inherits ActionFilterAttribute 
    Public Overrides Sub OnActionExecuted(actionExecutedContext As HttpActionExecutedContext) 
     If actionExecutedContext Is Nothing Then 
      Throw New ArgumentNullException("actionExecutedContext") 
     Else 
      actionExecutedContext.Response.Headers.Remove("Access-Control-Allow-Origin") 
      actionExecutedContext.Response.Headers.Add("Access-Control-Allow-Origin", "*") 
      actionExecutedContext.Response.Headers.Add("Access-Control-Allow-Headers", "Content-Type") 
      actionExecutedContext.Response.Headers.Add("Access-Control-Allow-Methods", "GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS") 
     End If 
     MyBase.OnActionExecuted(actionExecutedContext) 
    End Sub 
End Class 

とallowcors

<AllowCors> 
    <EnableCors("*", "*", "*")> 
    <HttpGet> 
    <CustomAuthentication> 
    <Authorize(Roles:="WebService")> 
    Public Function logon() As IHttpActionResult 
     Return Ok("successfully loggon on") 
    End Function 

まだ運

status: 404 
Method: OPTIONS 
Request Headers: Host: xxxxxx.dir.ad.dla.mil 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-US,en;q=0.5 
Accept-Encoding: gzip, deflate 
Origin: null 
Access-Control-Request-Method: GET 
Access-Control-Request-Headers: authorization 
Connection: keep-alive 

Response Headers: Cache-Control: private 
Content-Type: text/html 
Server: Microsoft-IIS/7.5 
X-Powered-By: ASP.NET 
X-Frame-Options: SAMEORIGIN 
Date: Wed, 23 Mar 2016 16:53:06 GMT 
Content-Length: 1245 
+0

をこの設定を追加しようとすることができます構造体の 'App_code'で' Startup.cs'を見つけることができますか?あなたはweb api2 – Webruster

+0

を使用していると言いましたので、これはどうやってダウンしましたか?私たちは既存のaspx Webフォームアプリケーションを持っています。そして、私はnuに入り、事実の後にWeb APIパッケージに追加しました。だから私は通常あなたのような典型的なapp_startフォルダを持っていないのですが、bundle_config、route_configなどがあります。代わりに、ルーティングなどは、application_start(私のポストの最初のコードブロックを参照)の下でグローバルasaxに入ります。それを悪臭にする他のものは、VBのアプリケーションです、それはVBのを使用してWeb APIの例を見つけることは困難でした。 –

+0

あなたのwebconfigを表示することができますし、この方法でcorsを有効にしようとすることもできます 'var context = HttpContext.Current; \t \t var response = context.Response; \t \t \t \t // CORSを有効 \t \t response.AddHeader( "アクセス制御 - 許可 - 起源"、 "*"); \t \t Response.AddHeader( "X-Frame-Options"、 "ALLOW-FROM *"); in Application_Start – Webruster

答えて

0

にインストールします。アクションレベルでコントローラレベル

  • でグローバルレベル

    グローバルレベルで、にCORSサポートを設定するにはは、最初の(あなたがすでにやった)CORSパッケージ をインストールして、オープンWebApiConfig.csはApp_Startフォルダからファイルを。(ここでは、あなたがそのフォルダを持っていけないと述べた)

    Dim cors = New EnableCorsAttribute("http://localhost:5901", "*", "*") 
    config.EnableCors(cors) 
    

    (あなたがそのメソッドを使用していないため、その後、我々はあなたがすべてのヘッダーを許可し、設定することで、すべてのHTTPメソッドをサポートするためのパラメータを設定する必要があり、上記の方法では、次のレベル)

    アクションレベル

    <EnableCors(origins := "*", headers := "*", methods := "*")> 
        <HttpGet> 
        <CustomAuthentication> 
        <Authorize(Roles:="WebService")> 
    Public Function logon() As IHttpActionResult 
         Return Ok("successfully loggon on") 
        End Function 
    

    に行きます星になる価値。この中

    コントローラレベル

    <EnableCors(origins := "*", headers := "*", methods := "*")> _ 
    Public Class ClassesController 
        Inherits ApiController 
    End Class 
    

    あなたはすべてのヘッダーを許可し、スターに値を設定することで、すべてのHTTPメソッドをサポートするためのパラメータを設定する必要があります。 [DisableCors]属性を使用して、CORSサポートからアクションの1つを除外できます。

    だから、最終的にはここでEnableCors

    属性がある3つの属性がありますがEnableCorsに渡す:

    1. 起源:あなたは、カンマで区切られた複数の起源の値を設定することができます。原点からAPIへのAJAX要求を行う場合は、原点値をワイルドカード値のstarに設定します。
    2. 要求ヘッダー:Requestヘッダーパラメーターは、どのRequestヘッダーが許可されるかを指定します。任意のヘッダー設定値を許可するには*
    3. HTTPメソッド:メソッドパラメーターは、リソースにアクセスできるHTTPメソッドを指定します。すべてのメソッドを許可するには、ワイルドカード値 '*'を使用します。それ以外の場合は、コンマで区切ったメソッド名を設定して、一連のメソッドがリソースにアクセスできるようにします。ですから、
      <EnableCors(origins := "http://localhost:XXX,http://localhost:YYYY", headers := "*", methods := "POST,GET")> _ 
      Public Class ClassesController 
          Inherits ApiController 
      End Class 
      

      以下

      として宣言する必要がVBで上記の点を組み合わせ

    更新

    ウェブ-config設定に

    <customHeaders> 
    <add name="Access-Control-Allow-Origin" value="*" /> 
    <add name="Access-Control-Allow-Methods" value="GET, PUT, POST, DELETE, HEAD, OPTIONS" /> 
    <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" /> 
    <add name="Access-Control-Allow-Headers" value="Content-Type, Accept, Authorization" /> 
    </customHeaders> 
    
  • +0

    あなたの提案に感謝します、私はすべての3つのレベルでCORSを設定しています(カスタムフィルタを追加するだけでなく、元の投稿を参照してください)。その設定ファイルを変更することはできません。私はローカルホスト上で実行すると再びすべてうまく動作します。 (クライアントは自分のデスクトップや別のビジュアルスタジオのソリューション上で動作し、ローカルホスト上で実行されているWeb APIを指しています)、CORSは「実際の」サーバに移動するとブロックされます。私がブロックする可能性のある7.5のサーバー設定がありますか? –

    +0

    <= "アクセス制御 - 許可 - 起源" 値名を追加= "*" /> < '<設定> のWebConfigでこれを与えることを試みるuser2744722 @/customHeaders> の 'IIS – Webruster

    +0

    に関する設定ので、これはweb.configファイルに行くことができますか? server.configではなく?私はserver.configを変更することが許可されていないので、 –

    0

    と私のコントローラを飾る私はあなたがMicrosoft.AspNet.Corsを追加し忘れてしまったと思います。 - >あなたがMicrosoft.AspNetを見つける必要がありソリューション

    ためNugetパッケージの管理

    [ツール] - > [Nugetパッケージマネージャ:Visual Studioを使用する場合は、この方法の使用を追加することができます。CORSとあなたは3つのレベルでCORSにウェブAPIについてサポートを設定することができ、APIプロジェクト

    +0

    EnableCors()が間違っている可能性があります。 config.MapHttpAttributeRoutes(); var cors = new EnableCorsAttribute( "*"、 "*"、 "*"); config.EnableCors(cors); 私のWeb API設定。これを試してみたいと思ったら、 –

    関連する問題