2017-02-01 9 views
1

ASP.NETコアアプリケーションにAPIコントローラがあります。ASP.NETコアの間違ったAPI URL

[Route("api")] 
public class UserController : Controller 
{ 
    [HttpGet("{userName}/product_info")] 
    public IActionResult GetProductInfo(string userName) 
    { 
     List<ProductInfo> productInfos = _repo.GetProductInfoByUserName(userName); 
     if (productInfos.Count > 0) 
      return Ok(productInfos); 
     else 
      return BadRequest("Unable to process requrest"); 
    } 
} 

/api/{username}/product_infoを使用して上記APIを呼び出すことができます。 ユーザーが間違ったURLを入力した場合、UseStatusCodePagesWithRedirects()を使用して404ページにリダイレクトしています。ここでの問題は、私が/api/{username}/product_oのような間違ったAPIのURLを使用した場合です。 404ページにリダイレクトされ、ステータスコード200が返されます。このAPIはangular.jsとともに使用しています。 APIは状態コード200の間違ったURLの404ページを返すので、thenメソッドのエラー機能は$httpと呼ばれることはありません。response.dataには404ページのHTMLがあります。誤ったAPI URLが呼び出されたとき404の状態コードを返し、間違ったNON API URLが呼び出されたときに通常の404ページを返すにはどうすればよいですか? 以下は、間違ったAPI URLを呼び出したときのスクリーンショットです。 startup.cs作品のconfigure方法における次の部分を追加this link に@Daboul提案し、溶液に基づく enter image description here

Func<HttpContext, bool> isApiRequest = (HttpContext context) => context.Request.Path.ToString().Contains("/api/"); 
app.UseWhen(context => !isApiRequest(context), appBuilder => 
{ 
    appBuilder.UseStatusCodePagesWithRedirects("~/Error/{0}"); 
}); 

答えて

1

は私がUseStatusCodePages()またはUseStatusCodePagesWithRedirects()のようなミドルウェアを使用することによって、あなたが実際に(ブラウザにコード200を送信するために必要)エラーコードを含む適切なHTMLページを返す代わりにすることを決定していると信じていますコード自体を返します。これは、通常、セキュリティ面では優れた方法と考えられています。あなたが経験していることは私にとっては論理的です。たぶん、私はそれがあなたの場合に役立つかどうかは分かりませんが、UseStatusCodePagesWithRedirects()の使用をUseWhen()を使用しているすべてのコントローラーに限定することで、この特定の "/ api/"コントローラはまだ404を返しますか?または、角度で答えを解析して、エラーが発生したかどうかを検出します。

+0

私はangular.jsを初めて使っていますので、JavaScriptの面ではあまりできません。 ASP.NET側では、StatusCodePagesを使用してAPIコントローラを除外するためにどのようなミドルウェアを使用する必要がありますか?この問題は、APIコントローラに 'Authorize'属性を追加した場合にも発生します。ログインせずにAPIにアクセスしようとすると 'Authorize'属性が追加された後、200のステータスコードを持つログインページが返されます。このため、 'Authorize'属性を削除しなければなりませんでした。 –

+0

UseWhen()がその作業を行います。ここで例を見つけることができます:http://stackoverflow.com/questions/37841270/branching-asp-net-core-pipeline-authentication UseWhen()をURLの条件と組み合わせて使用​​する 'context.Request.Path .StartsWithSegments( "/ API /") ' – Daboul

+0

あなたのUpdate1バージョンでは、app.UseWhen(context =>!isApiRequest(context)、appBuilder => { app.UseStatusCodePagesWithRedirects("〜/ Error/{0} "); (0)」); }); 'switch app for 'は、appButtonを使用しているため、 appbuilder。 – Daboul

関連する問題