2017-06-22 30 views
1

Web APIでCORを有効にしましたが、ChromeではGETリクエストとPOSTリクエストの両方が失敗しますが、MS EdgeブラウザではGETリクエストは問題なく動作しますが、POSTリクエストを試みるとCORs Web API 2.0でのリクエスト

無効な 構文のため、要求をサーバーで処理できませんでした。

XMLHttpRequest:ネットワークエラー0x80070005、アクセスが拒否されました。

ポストのコードは、クロスドメイン有効にした標準のAjaxリクエストです:

$.ajax({ 
    type: "POST", 
    crossDomain: true, 
    url: 'http://localhost:50915/api/addjob', 
    data: JSON.stringify(Job), 
    contentType: "application/json;charset=utf-8", 
    success: function (data, status, xhr) { 
     alert("The result is : " + status + ": " + data); 
    }, 
    error: function (xhr) { 
     alert(xhr.responseText); 
    } 
}); 

とWeb API側で私はCORS Nugetパッケージをインストールし、コードを有効にするには、以下のものを追加しました:

WebApiConfig.cs

public static void Register(HttpConfiguration config) 
     { 
      // Web API configuration and services 
      config.EnableCors(); 

      // Web API routes 
      config.MapHttpAttributeRoutes(); 

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

      var JsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().FirstOrDefault(); 
      if (JsonFormatter != null) 
       JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 
     } 

とコントローラ:

[System.Web.Http.HttpPost] 
[System.Web.Http.Route("api/addjob")] 
[EnableCors(origins: "http://localhost", headers: "*", methods: "*")] 
public void AddJob([FromBody] Job job) 
{ 
    using (_tmsPortalDb) 
    { 
     _tmsPortalDb.Jobs.Add(job); 
     _tmsPortalDb.SaveChanges(); 
    } 
} 

URLはどちらもローカルホストですが、異なるポートで実行されていますが、同じVSソリューション内に別々のプロジェクトとして存在します。 CORサポートの私の理解は、ローカルホストのデバッグの問題を解決するはずです。私が見逃したことはありますか?

+1

ちょうど野生の推測と私の角度アプリでconfigです:あなたのWebアプリケーションのホストのポートを追加したらどう? '[EnableCors(オリジン:" http:// localhost:SomeOthePort "、ヘッダー:" * "、メソッド:" * ")]' –

答えて

0

IISでホストされている場合は、以下をお試しください。下記のホステッドOWINについては

 config.EnableCors(new EnableCorsAttribute("*", "*", "*") { SupportsCredentials = true }); 

はWEBAPI

public class Startup { 

    public void Configuration(IAppBuilder app) { 

     AntiForgeryConfig.UniqueClaimTypeIdentifier = Constants.ClaimTypes.Subject; 

     JwtSecurityTokenHandler.InboundClaimTypeMap.Clear(); 

     var config = new HttpConfiguration(); 
     app.UseCors(CorsOptions.AllowAll); 

     //Middleware for security. This will introspect the incoming reference token 
     IdentityServerBearerTokenAuthenticationOptions _options = new IdentityServerBearerTokenAuthenticationOptions { 
      Authority = ConfigurationManager.AppSettings["IdentityServerURI"], 
      ValidationMode = ValidationMode.ValidationEndpoint, 
      RequiredScopes = new[] { "xxxxxadmin" }, 
      ClientId = "xxxxxadmin", 
      ClientSecret = "api-secret", 
      EnableValidationResultCache = true, 
      ValidationResultCacheDuration = TimeSpan.FromMinutes(10)     
     }; 

     app.UseIdentityServerBearerTokenAuthentication(_options); 

     //Boots up the application 
     Bootstraper.BootUp(config, app); 
    } 
} 
関連する問題