<a class="postlink" href="https://aspnetboilerplate.com/Pages/Documents/Handling-Exceptions">https://aspnetboilerplate.com/Pages/Doc ... Exceptions</a>
May i know if i want to pass Exception Message to my WPF client
on the WPF client, i have used the library Abp.WebApi.Client.IAbpWebApiClient
but i am not sure how to pass the exception from the backend to this client.
Please advise. THanks a lot
7 Answer(s)
-
0
Hi @itzoar2,
This sample might be helpful for you <a class="postlink" href="https://github.com/aspnetboilerplate/aspnetboilerplate-samples/tree/master/ConsoleRemoteWebApiCall">https://github.com/aspnetboilerplate/as ... WebApiCall</a>.
Markdown is supportedCopy & paste or drag & drop images (max 30 MB per image) -
0
Hi
So on the Backend server side can we still throw UserFriendlyException ?
Will AbpRemoteCallException class be able to catch UserFriendlyException ?
<a class="postlink" href="https://aspnetboilerplate.com/Pages/Documents/Handling-Exceptions">https://aspnetboilerplate.com/Pages/Doc ... Exceptions</a>
Look forward your reply. Thanks
Markdown is supportedCopy & paste or drag & drop images (max 30 MB per image) -
0
Yes, because UserFriendlyException is serializable, see <a class="postlink" href="https://github.com/aspnetboilerplate/aspnetboilerplate/blob/dev/src/Abp/UI/UserFriendlyException.cs">https://github.com/aspnetboilerplate/as ... ception.cs</a>.
Markdown is supportedCopy & paste or drag & drop images (max 30 MB per image) -
0
When my backend service throw back a new UserFriendlyException
then on my WPF cleint (below code), i didn't catch on the AbpRemoteCallException block
So my question is , should I throw userfriendlyxception or abpremotecallexception if know client is not client calling back end while API layer
Please advise. Thanks a lot
public async Task<int> AddAsync<TInput>(TInput input, string serviceLink) { try { var result = await _abpWebApiClient.PostAsync<object>(BaseUrl + serviceLink, input, timeout: null); return Convert.ToInt32(result); } catch (AbpRemoteCallException e) { Logger.Error("Error on AddAsync : input " + input.ToString()); Logger.Error("Error on AddAsync : serviceLink" + serviceLink); Logger.Error("Error on AddAsync : Error Message" + e.Message); throw; } catch (Exception e) { Logger.Error("Error on AddAsync : input " + input.ToString()); Logger.Error("Error on AddAsync : serviceLink" + serviceLink); Logger.Error("Error on AddAsync : Error Message" + e.Message); throw; } }Markdown is supportedCopy & paste or drag & drop images (max 30 MB per image) -
0
I have made use the example console app <a class="postlink" href="https://github.com/aspnetboilerplate/aspnetboilerplate-samples/tree/master/ConsoleRemoteWebApiCall">https://github.com/aspnetboilerplate/as ... WebApiCall</a>
I find that the webapi client won't catch any UserFriendlyException or AbpRemoteCallException exception
It can only catch Abp.AbpException
and it always return somethings like
"Could not made request to <a class="postlink" href="http://localhost:6240/api/services/app/role/GetRoles">http://localhost:6240/api/services/app/role/GetRoles</a>! StatusCode: InternalServerError, ReasonPhrase: Internal Server Error"
Please advise how can a WPF client that call WebApi layer can get meaningful exception. Thanks
My backend GetRoles function
public async Task<ListResultDto<RoleListDto>> GetRoles(GetRolesInput input) {throw new UserFriendlyException(404, "message", "MessageDetail"); var roles = await _roleManager .Roles .WhereIf( !input.Permission.IsNullOrWhiteSpace(), r => r.Permissions.Any(rp => rp.Name == input.Permission && rp.IsGranted) ) .ToListAsync();
return new ListResultDto<RoleListDto>(roles.MapTo<List<RoleListDto>>()); }Markdown is supportedCopy & paste or drag & drop images (max 30 MB per image) -
0
Just check the source code of AbpWebApiClient
<a class="postlink" href="http://sourcebrowser.io/Browse/aspnetboilerplate/aspnetboilerplate/src/Abp.Web.Api/WebApi/Client/AbpWebApiClient.cs">http://sourcebrowser.io/Browse/aspnetbo ... iClient.cs</a>
Looks like the web api client always throw AbpException. May i know how to change the backend function in order to generate the AbpRemoteCallException in this case. Thanks
public async Task<TResult> PostAsync<TResult>(string url, object input, int? timeout = null) where TResult : class, new() { using (var client = new HttpClient()) { client.Timeout = timeout.HasValue ? TimeSpan.FromMilliseconds(timeout.Value) : Timeout; if (!BaseUrl.IsNullOrEmpty()) { client.BaseAddress = new Uri(BaseUrl); } client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); using (var requestContent = new StringContent(Object2JsonString(input), Encoding.UTF8, "application/json")) { using (var response = await client.PostAsync(url, requestContent)) { if (!response.IsSuccessStatusCode) {<span style="color:#0040FF"> throw new AbpException("Could not made request to " + url + "! StatusCode: " + response.StatusCode + ", ReasonPhrase: " + response.ReasonPhrase);</span> }
var ajaxResponse = JsonString2Object<AjaxResponse<TResult>>(await response.Content.ReadAsStringAsync()); if (!ajaxResponse.Success) { throw new AbpRemoteCallException(ajaxResponse.Error); } return ajaxResponse.Result; } } } }Markdown is supportedCopy & paste or drag & drop images (max 30 MB per image) -
0
@itzoar2 The problem is, even when you throw UserFriendlyException on the server side, the returned status code will be 500 to client. So, if you want to get the UserFriendlyException message on the client side, you need to run your code in a try-catch block like below;
try { //Make your Http request here... } catch (WebException wex) { var pageContent = new StreamReader(wex.Response.GetResponseStream()).ReadToEnd(); }Markdown is supportedCopy & paste or drag & drop images (max 30 MB per image)