4

ApiKey検証のサンプルコードを以下に示します(MVC4 Web api RCを使用しています)。

public class ApiKeyFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext context)
    {
        //read api key from query string
        string querystring = context.Request.RequestUri.Query;
        string apikey = HttpUtility.ParseQueryString(querystring).Get("apikey");

        //if no api key supplied, send out validation message
        if (string.IsNullOrWhiteSpace(apikey))
        {                
            var response = context.Request.CreateResponse(HttpStatusCode.Unauthorized, new Error { Message = "You can't use the API without the key." });
            throw new HttpResponseException(response);
        }
        else
        {          
             try
            {
                GetUser(decodedString); //error occurred here
            }
            catch (Exception)
            {
                var response = context.Request.CreateResponse(HttpStatusCode.Unauthorized, new Error { Message = "User with api key is not valid" });
                throw new HttpResponseException(response);
            }
        }
    }
}

ここでの問題は、Catchブロックステートメントにあります。カスタムエラーメッセージをユーザーに送信したかっただけです。しかし、何も送信されません。空白の画面が表示されます

ただし、以下のステートメントは正常に機能しており、検証エラーメッセージを正しく送信します。

if (string.IsNullOrWhiteSpace(apikey))
{                
    var response = context.Request.CreateResponse(HttpStatusCode.Unauthorized, new Error { Message = "You can't use the API without the key." });
    throw new HttpResponseException(response);
}

私が間違っていることはありますか?

4

1 に答える 1

13

私はまったく同じシナリオで同じ問題を抱えていました。ただし、このシナリオでは、表示されるように応答で一部のコンテンツを返す必要があり、実際には例外をスローしません。したがって、これに基づいて、コードを次のように変更します。

 catch (Exception)
 {
    var response = context.Request.CreateResponse(httpStatusCode.Unauthorized);
    response.Content = new StringContent("User with api key is not valid");
    context.Response = response;
 }

したがって、この変更により、空白の画面の代わりにコンテンツが表示された応答が返されます。

于 2012-06-25T14:20:49.563 に答える