2011-04-13 103 views
26

我有一個在c#/ asp.net中編程的Web服務。Asp.Net網絡服務:我想返回錯誤403禁止

[WebService(Namespace = "http://example.com/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[ScriptService] 
[System.ComponentModel.ToolboxItem(false)] 
public class Service: System.Web.Services.WebService 
{ 

    [WebMethod] 
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
    public Result GetData() 
    { 
     User user = GetUser(); 

     if (user.LoggedIn) 
     { 
      return GetData(); 
     } 
     else 
     { 
      // raise exception -> return error 403 
     } 
    } 

如何才能從此Web服務返回錯誤403?我可以拋出一個異常 - 但這顯示了exeption而不是他的錯誤。

任何想法?

+0

您從服務的返回值只有當用戶是'已登錄',你必須從該方法返回'結果'類型。 – 1110 2011-04-13 13:28:30

+0

以及如何返回此「結果」類型? – bernhardrusch 2011-04-13 13:40:17

+0

你聲明你的方法返回'Result'類型。你必須從你的方法中返回該類型的對象。什麼是'數據()'?你不能從一個'if'塊返回一些東西,因爲如果這個塊是假的,你的方法不會返回任何東西。 – 1110 2011-04-13 13:49:59

回答

16

要完全回答這個問題 - 這是我使用的代碼(謝謝你黽瞭解更多信息):

[WebService(Namespace = "http://example.com/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[ScriptService] 
[System.ComponentModel.ToolboxItem(false)] 
public class Service: System.Web.Services.WebService 
{ 

    [WebMethod] 
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
    public Result GetData() 
    { 
     User user = GetUser(); 

     if (user.LoggedIn) 
     { 
      return GetData(); 
     } 
     else 
     { 
      Context.Response.Status = "403 Forbidden"; 
      //the next line is untested - thanks to strider for this line 
      Context.Response.StatusCode = 403; 
      //the next line can result in a ThreadAbortException 
      //Context.Response.End(); 
      Context.ApplicationInstance.CompleteRequest(); 
      return null; 
     } 
    } 
+0

與WebMethod和ScriptMethod一起使用時,這會給我一個ThreadAbortException。 – Eterm 2015-07-20 13:18:21

+0

嘗試使用Context.ApplicationInstance.CompleteRequest()而不是Context.Response.End() – bernhardrusch 2015-07-20 14:21:22

+1

值得一提的是'Response.Status =「403 Forbidden」; '是由'Response.StatusCode'和'Response.StatusDescription'組成的完整'status'。使用'Response.StatusDescription'而不是'Response.Status'可能更好 - – 2016-09-20 20:40:18

0

禁止403將訪問您的網站上的禁止內容的結果。我想你想要的這裏是返回的消息作爲結果的一部分,即「用戶未登錄」

3
Context.Response.StatusCode = 403; 
+0

我在哪裏得到這個響應對象[我可以'直接訪問]? – bernhardrusch 2011-04-13 14:02:03

+0

從上下文屬性。 – 2011-04-13 14:02:41

+1

Context.Response.Status =「403 Forbidden」; Context.Response.End(); 返回null; – bernhardrusch 2011-06-07 13:20:40

1

您的Web服務請求將第一次遇到你的Global.asax文件。你可以在那裏檢查&。

7

您可以通過將代碼放入您的WebService構造函數來保護您的所有方法。這可以防止甚至被稱爲你的WebMethod:

public Service(): base() 
{ 
    if (!GetUser().LoggedIn) 
    { 
     Context.Response.StatusCode = (int)System.Net.HttpStatusCode.Forbidden; 
     Context.Response.End(); 
    } 
} 
21

你不需要同時設置Context.Response.StatusContext.Response.StatusCode。簡單設置

Context.Response.StatusCode = (int)System.Net.HttpStatusCode.Forbidden 

會自動爲您設置Response.Status

+0

它應該是對@bernhardrusch的評論回答 – 2017-12-07 13:40:26

14

如果您正在使用MVC你會做到以下幾點:

  return new HttpStatusCodeResult(HttpStatusCode.Forbidden); 
5

在Asp.Net網絡API 2,你會使用:

return new StatusCodeResult(HttpStatusCode.Forbidden, this); 
+0

這根本不回答問題!這個問題涉及到一個WebService,這是WebApi2 – 2017-03-31 11:27:24

+0

我明白你的意思,但我正在修復一些遺留問題,並且不需要知道我已經知道的另一個問題的答案! – 2017-04-03 13:49:40

+0

好吧,我的壞..沒有意識到人們仍然會在網絡服務上工作。 – arviman 2017-04-03 13:51:36

相關問題