Я использую службу 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
не перенаправляет и что-то странное?
Предполагается, что веб-служба потребляется машинами, а не людьми, поэтому нет смысла в веб-службе, отображающей страницу с ошибкой.
Кроме того, служба 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
[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
}
}