我尝试使用身份验证过滤器在网络mvc app webapi(.net和c#)上发布来自旧delphi应用程序的数据。如果密码错误,则返回401,但不引发异常,结果为空。现在我被迫手动检查响应代码! HTTPOptions没关系。
try
Result := IdHTTP.Post(requestUrl, JsonToSend);
//In this way I fixed this problem but it's very annoying! :(
//if (IdHTTP.ResponseCode<>200) then raise Exception.Create(IdHTTP.ResponseText);
except
on E: EIdHTTPProtocolException do
begin
raise Exception.Create(E.Message);
end;
on E : Exception do
raise Exception.Create(e.Message);
end;
答案 0 :(得分:2)
响应代码401 NOT 是HTTP错误,这就是为什么EIdHTTPProtocolException
不会立即引发的原因。 401是服务器向客户端请求身份验证凭据的方式。 TIdHTTP
通过检查以下标准来处理401:
认证尝试次数尚未超过TIdHTTP.MaxAuthRetries
属性的值(默认为3)。
TIdHTTP.Response.WWWAuthenticate
属性指定TIdHTTP
识别的身份验证方案,或者分配TIdHTTP.OnSelectAuthorization
事件处理程序,并在其AuthenticationClass
输出中返回身份验证类类型参数。
分配了TIdHTTP.OnAuthorization
事件处理程序,并在其Handled
输出参数中返回True(从用户获取更新的凭据后),或TIdHTTP.Request.Password
属性不为空。
所选授权方案尚未用完(BASIC
为1,NTLM
为3等)。
如果上述任何条件不合适,则会引发EIdHTTPProtocolException
,除非您:
在hoNoProtocolErrorException
属性中启用TIdHTTP.HTTPOptions
标记。
在AIgnoreReplies
的{{1}}参数中指定401(TIdHTTP.DoRequest()
不会公开该参数,但TIdHTTP.Post()
会公开。
在其中任何一种情况下,当前请求只是没有错误地结束,您必须手动检查TIdHTTP.Get()
属性。
另一方面,如果上述条件正常,并且TIdHTTP.ResponseCode
属性中启用了hoInProcessAuth
参数,则会使用(可能更新的)身份验证凭据重试当前请求。但是如果未启用TIdHTTP.HTTPOptions
,则当前请求将立即结束而不会出现错误,您必须手动检查hoInProcessAuth
属性。默认情况下未启用TIdHTTP.ResponseCode
,因此这是您hoInProcessAuth
请求结束的可能分支。
服务器返回401的事实意味着服务器需要身份验证,因此您应该处理它。启用Post
并根据需要处理hoInProcessAuth
和OnSelectAuthorization
事件,以便每次用户提供新凭据时都可以重试请求。
但是,如果您真的希望401引发异常,请启用OnAuthorization
并且根本不处理事件。或者,继续做你正在做的事情。