【问题标题】:WCF service redirectWCF 服务重定向
【发布时间】:2014-07-31 10:19:20
【问题描述】:

我正在使用 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 不重定向并且做了一件奇怪的事情吗?

【问题讨论】:

    标签: c# jquery asp.net wcf redirect


    【解决方案1】:
     [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
            }
        }
    

    【讨论】:

      【解决方案2】:

      Web 服务应该由机器而非人类使用,因此显示错误页面的 Web 服务没有任何意义。

      此外,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

      【讨论】:

      • 为什么没有任何意义?你能解释一下你的观点吗?为什么我不应该在 WCF 服务中重定向?
      • 非常感谢!现在真的很清楚了!我一定会听从你的建议!
      【解决方案3】:

      对于 global.asax

      HttpContext.Current.Response.StatusCode = (int)HttpStatusCode.Redirect;
      HttpContext.Current.Response.Headers.Add("Location", NewPath);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-05
        • 1970-01-01
        • 1970-01-01
        • 2021-05-28
        • 1970-01-01
        相关资源
        最近更新 更多