Перенаправление службы WCF

0

Я использую службу WCF (включен Ajax). В моей службе, когда возникает ошибка, я регистрирую ее в БД, и я перенаправляю пользователя на страницу с ошибкой.

Чтобы перенаправить пользователя, я использую следующее:

HttpContext.Current.Response.Redirect("error.aspx");

Поэтому я регистрирую ошибку и перенаправляю пользователя

Дело в том, что при возникновении ошибки она регистрируется несколько раз, и пользователь не перенаправляется.

Когда я говорю, что он регистрируется несколько раз, это означает: у меня есть несколько записей об ошибках в моей БД для этой ошибки. (Предположим, что у вас один журнал для одной ошибки)

Поэтому я попытался понять: почему?

Похоже, что когда я пытаюсь перенаправить, метод службы снова начинается (например, он снова вызван).

Здесь мой полный процесс:

Я вызываю службу с помощью jquery:

$.getJSON("ContactService.svc/getsubtitle", { titleid: titleid }, function (data) {
       ...
});

Здесь метод обслуживания:

[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Json)]
public void getsubtitle(string titleid)
{

    try
    {
        .... (ERROR !)   

    }
    catch (Exception ex)
    {
        LogTheError(ex);
        HttpContext.Current.Response.Redirect("error.aspx");
    }
}

Итак, можете ли вы, ребята, помочь мне понять, почему HttpContext.Current.Response.Redirect не перенаправляет и что-то странное?

Теги:
redirect
wcf

2 ответа

6
Лучший ответ

Предполагается, что веб-служба потребляется машинами, а не людьми, поэтому нет смысла в веб-службе, отображающей страницу с ошибкой.

Кроме того, служба WCF должна быть транспортно-агностической, поскольку она может использовать другие транспортные каналы, кроме http, такие как tcp, именованные каналы и многое другое. Вы предполагаете, что есть HttpContext и клиент, который будет понимать, что такое код состояния HTTP-302, который будет отправлен клиенту после вызова Response.Redirect. Это неправильно, вы не должны предполагать, что ваш потребитель будет определенным видом программного обеспечения или имеет определенные возможности, как веб-браузер.

Вместо этого создайте класс POCO, объявите его как атрибут FaultContract и верните ответ об ошибке там. Это будет полезно для обслуживания потребителей, а не для html-страницы.

См. Эту статью о том, как выполнить обработку контрактов с ошибками в WCF:

http://www.codeproject.com/Articles/376303/Fault-Contract-Handling-Errors-in-WCF-and-A-Very-S

  • 0
    Почему это не имеет никакого смысла? Можете ли вы объяснить больше свою точку зрения? Почему я не должен перенаправлять в сервисы WCF?
  • 0
    @VincP. Я обновил свой предыдущий ответ с более подробной информацией.
Показать ещё 1 комментарий
6
 [ServiceContract]
    public class Service1 
    {
        [OperationContract, WebGet(UriTemplate="ProcessSomething?a={a}&b={b}")]
        public void GetData(string a, string b)
        {
            WebOperationContext.Current.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.Redirect;
            WebOperationContext.Current.OutgoingResponse.Headers.Add("Location", "http://www.microsoft.com");

            //process request here
        }
    }
  • 0
    это было огромно, спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню