Как я могу поймать исключение от внутреннего сервера, используя IMobileServiceSyncTable - InsertAsync? - PullRequest
0 голосов
/ 02 июля 2018

Я использую IMobileServiceSyncTable из мобильного приложения Azure. В операции InsertAsync на стороне внутреннего сервера у меня были некоторые проверки для данных, и, если эта проверка не удалась, я хочу выдать Exception со стороны сервера. Я попытался вернуть InternalServerError (), сгенерировать исключение HttpResponseException, но никогда не работал на стороне клиента. Я отладил метод Post на стороне сервера, сервер выдает исключение или возвращает InternalServerError, но в мобильном клиенте ошибка не возникает.

Кто-нибудь может мне помочь?

Вот мой код на стороне клиента:

public async Task<bool> AddPaciente(Paciente novoPaciente)
{
    //other things

    try
    {
        await _pacienteTable.InsertAsync(novoPaciente);
    }
    catch (Exception e)
    {
        Debug.WriteLine(e.Message);
        Debug.WriteLine(e.StackTrace);

        throw new WebException(AppResources.MensagemFalhaConexaoServidorAzure);
    }

    await SyncPaciente();

    return true;
} 

Вот мой метод публикации на стороне внутреннего сервера

// POST tables/Paciente
public async Task<IHttpActionResult> PostPaciente(Paciente novoPaciente)
{   

    //other things

    if (paciente != null)
    {
        var responseMessage = new HttpResponseMessage(HttpStatusCode.BadRequest)
        {
            Content = new StringContent("Já existe um paciente com esse token cadastrado.")
        };

        //throw new HttpResponseException(responseMessage);
        return InternalServerError(new Exception("Já existe um paciente com esse token cadastrado."));
    }
}

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Я использую IMobileServiceSyncTable из мобильного приложения Azure. В операции InsertAsync на стороне внутреннего сервера у меня были некоторые проверки для данных, и, если эта проверка не удалась, я хочу выдать Exception со стороны сервера.

Для IMobileServiceSyncTable вы имеете дело с Автономным клиентом , что означает, что IMobileServiceSyncTable<T>.InsertAsync будет напрямую вставлять данные в локальное хранилище SQLite на стороне вашего мобильного клиента. Пока вы не вызовете MobileServiceClient.SyncContext.PushAsync() вручную, локальное хранилище данных будет отправлено на ваш мобильный сервер. Для этого подхода я бы порекомендовал вам убедиться, что вам нужно проверить входные данные, прежде чем сохранять их в локальном хранилище данных, в противном случае ваши операции push не будут выполнены, а затем вам придется заставить своего клиента настраивать существующие входные данные даже после него. был успешно добавлен ранее.

Если вы используете Онлайн-клиент следующим образом, оба ваших подхода к выбрасыванию исключения будут немедленно возвращены вашему клиенту.

var mobileClient= new MobileServiceClient("https://{your-mobile-app-name}.azurewebsites.net");
var _pacienteTable= mobileClient.GetTable<Paciente>();
await _pacienteTable.InsertAsync(novoPaciente);

Кроме того, я использовал следующую строку кода для перехвата исключения:

try
{
    await table.InsertAsync(item);
}
catch (MobileServiceInvalidOperationException ex)
{
    //TODO:
    //await ex.Response.Content.ReadAsStringAsync(); //get detailed response content
}
catch (Exception e)
{
    //TODO: other uncaught exception
}

Кроме того, для аналогичной проблемы вы могли бы использовать Fiddler для захвата сетевых трассировок, чтобы сузить эту проблему, чтобы ваша клиентская сторона могла правильно получить соответствующий ответ.

0 голосов
/ 03 июля 2018

Вы должны прослушать код состояния ответа.

var response = await _pacienteTable.InsertAsync(novoPaciente);

if (response.IsSuccessStatusCode) {
    var content = await response.Content.ReadAsStringAsync ();
}
else
{
//Here handle the error code
throw new WebException(AppResources.MensagemFalhaConexaoServidorAzure);
}
...