2011-04-13 3 views
26

C#/asp.net에서 프로그래밍 된 웹 서비스가 있습니다.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 
     } 
    } 

어떻게이 웹 서비스에서 오류 403을 반환 할 수 있습니까? 나는 예외를 던질 수있다. 그러나 이것은 그의 오류가 아니라 예외를 보여주는 것이다.

아이디어가 있으십니까?

+0

당신은 서비스에서 값을 반환 할 경우에만 사용자 'LoggedIn'인 경우 해당 메소드에서 'Result'유형을 반환해야합니다. – 1110

+0

및이 '결과'유형을 어떻게 반환합니까? – bernhardrusch

+0

'결과'유형을 반환하는 메소드를 선언합니다. 그리고 당신은 당신의 메소드에서 그 타입의 객체를 반환해야합니다. '데이터()'란 무엇입니까? 블록이 틀리면 아무 것도 반환하지 않기 때문에 하나의 'if'블록 만 반환 할 수 없습니다. – 1110

답변

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

+0

Context.Response.End() 대신 Context.ApplicationInstance.CompleteRequest()를 사용하십시오. – bernhardrusch

+1

'Response.Status = "403 Forbidden"; '는'Response.StatusCode'와'Response.StatusDescription'로 구성된 완전한'status'입니다. Response.Status 대신'Response.StatusDescription'을 사용하는 것이 더 낫습니다 –

0

금지 403은 귀하의 웹 사이트에서 금지 된 콘텐츠에 액세스 한 결과입니다. 나는 당신이 여기에 원하는 것은

3
Context.Response.StatusCode = 403; 
+0

어디서이 응답 객체를 얻을 수 있습니까 [ 직접 액세스 할 수 없습니까?] – bernhardrusch

+0

컨텍스트 속성에서. –

+1

Context.Response.Status = "403 금지됨"; Context.Response.End(); return null; – bernhardrusch

1

웹 서비스 요청이 먼저 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 Answer –

14

당신이 MVC를 사용한다면 당신은 할 거라고 다음

Asp.Net의 웹 API 2에서
  return new HttpStatusCodeResult(HttpStatusCode.Forbidden); 
5

, 당신은 사용하십시오 :

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

에 대한 주석이어야합니다. 이것은 전혀 대답하지 않습니다!질문은 WebService와 관련된 것이고 WebApi2입니다. –

+0

나는 당신이 말하는 것을 얻지 만, 나는 기존의 것들을 고치고 있었고 이미 알고있는 다른 질문에 대한 답을 알 필요가 없었습니다! –

+0

괜찮 았어. 사람들이 여전히 웹 서비스에서 일하고 있다는 것을 알지 못했다. – arviman