[asp.net-mvc] 간헐적 인 asp.net mvc 예외 : “공개 작업 방법 ABC를 컨트롤러 XYZ에서 찾을 수 없습니다.”

asp.net mvc에서 작업 방법을 찾을 수 없다는 간헐적 인 예외가 발생합니다. 예외는 다음과 같습니다.

컨트롤러 ‘Schoon.Form.Web.Controllers.ChrisController’에서 공개 작업 메서드 ‘Fill’을 찾을 수 없습니다.

이 응용 프로그램이 대부분 작동하기 때문에 라우팅이 올바르게 설정되어 있다고 생각합니다. 다음은 컨트롤러의 동작 방법입니다.

[ActionName("Fill")]
[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post), UserIdFilter, DTOFilter]
public ActionResult Fill(int userId, int subscriberId, DisplayMode? mode)
{
     //…
}

경로:

routes.MapRoute(
        "SchoonForm",
        "Form/Fill/{subscriberId}",
        new { controller = "ChrisController", action = "Fill" },
        new { subscriberId = @"\d+" }
    );

그리고 여기에 스택이 있습니다.

System.Web.HttpException : ‘Schoon.Form.Web.Controllers.ChrisController’컨트롤러에서 공용 작업 메서드 ‘Fill’을 찾을 수 없습니다. C : \ dev \ ThirdParty \ MvcDev \ src \ SystemWebMvc \ Mvc \ Controller.cs : line 197의 System.Web.Mvc.Controller.HandleUnknownAction (String actionName)에서 C의 System.Web.Mvc.Controller.ExecuteCore ()에서 : \ dev \ ThirdParty \ MvcDev \ src \ SystemWebMvc \ Mvc \ Controller.cs : line 164 at System.Web.Mvc.ControllerBase.Execute (RequestContext requestContext) in C : \ dev \ ThirdParty \ MvcDev \ src \ SystemWebMvc \ Mvc \ ControllerBase.cs : line 76 at System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute (RequestContext requestContext) in C : \ dev \ ThirdParty \ MvcDev \ src \ SystemWebMvc \ Mvc \ ControllerBase.cs : line 87 System.Web.Mvc.MvcHandler.ProcessRequest (HttpContextBase httpContext)에서 C :

다음은 모두 동일한 방식으로 작동하는 필터의 예입니다.

public class UserIdFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        const string Key = "userId";

        if (filterContext.ActionParameters.ContainsKey(Key))
        {
            filterContext.ActionParameters[Key] = // get the user id from session or cookie
        }

        base.OnActionExecuting(filterContext);
    }
}

고마워, 크리스



답변

답을 찾았습니다. 우리는 웹 로그를 조사했습니다. OPTIONS, PROPFIND 및 HEAD와 같은 이상한 http 작업 (동사 / 메서드)을 수신하는 것으로 나타났습니다.

이것은 일부 논문 예외의 원인으로 보입니다. 이것은 간헐적 인 이유를 설명합니다.

curl.exe 도구로 문제를 재현했습니다.

curl.exe -X OPTIONS http://localhost/v2.3.1.0/(S(boztz1aquhzurevtjwllzr45))/Form/Fill/273
curl.exe -X PROPFIND http://localhost/v2.3.1.0/(S(boztz1aquhzurevtjwllzr45))/Form/Fill/273
curl.exe -X HEAD http://localhost/v2.3.1.0/(S(boztz1aquhzurevtjwllzr45))/Form/Fill/273

우리가 사용한 수정은 web.config에 인증 섹션을 추가하는 것입니다.

<authorization>
  <deny users="*" verbs="OPTIONS, PROPFIND, HEAD"/>
</authorization>


답변

비슷한 문제가 있었지만 사용자가 로그인 시간이 초과 된 후 컨트롤러에 게시했기 때문에 발생하는 것으로 나타났습니다. 그런 다음 시스템은 로그인 화면으로 리디렉션됩니다. 로그인 후 사용자가 게시하려는 URL로 다시 리디렉션되었지만 이번에는 대신 GET 요청을 수행했기 때문에 [HttpPost] 속성으로 표시된 작업을 찾지 못했습니다.


답변

asp.net mvc에서 같은 문제가 있습니다. 이 오류-404를 찾을 수 없습니다. 이 방법으로 문제를 해결합니다-이 코드를 MyAppControllerBase(MVC) 에 넣습니다.

    protected override void HandleUnknownAction(string actionName)
    {
        this.InvokeHttp404(HttpContext);
    }

    public ActionResult InvokeHttp404(HttpContextBase httpContext)
    {
        IController errorController = ObjectFactory.GetInstance<PagesController>();
        var errorRoute = new RouteData();
        errorRoute.Values.Add("controller", "Pages");
        errorRoute.Values.Add("action", "Http404");
        errorRoute.Values.Add("url", httpContext.Request.Url.OriginalString);
        errorController.Execute(new RequestContext(
             httpContext, errorRoute));

        return new EmptyResult();
    }


답변

우리는 방금 응용 프로그램에 동일한 문제가 있었고 javascript / jquery 문제를 추적 할 수있었습니다. 나중에 jquery에 의해 POST로 재정의되는 Html.ActionLink ()를 사용하여 정의 된 응용 프로그램에 링크가 있습니다.

먼저 링크를 정의했습니다.

Html.ActionLink("Click Me", "SomeAction", new { id = Model.Id})

나중에 SomePostEventHandler 함수로 기본 작업을 재정의합니다.

 $(document).ready(function() {
      $('#MyLink').click(SomePostEventHandler);
 }

이것은 HttpPost 필터가있는 MVC 작업에 부딪 혔습니다.

 [HttpPost]
 public ActionResult SomeAction(int id)
 {
      //Stuff
 }

우리가 찾은 것은 대부분의 경우 이것이 훌륭하게 작동한다는 것입니다. 그러나 일부 느린 페이지로드 (또는 정말 빠른 사용자)에서 사용자는 jquery $ (document) .ready () 이벤트가 발생하기 전에 링크를 클릭했습니다. 즉, 전기.

사용자가 해당 URL을 가져 오는 것을 원하지 않으므로 필터를 제거하는 것은 옵션이 아닙니다. 대신 액션 링크의 onclick 이벤트를 직접 연결했습니다 (이 작업을 수행하려면 SomePostEventHandler ()를 약간 변경해야했습니다).

string clickEvent = "return SomePostEventHandler(this);";

Html.ActionLink("Click Me", "SomeAction", new { id = Model.Id}, new { onclick = clickEvent })

따라서 적어도 우리에게이 이야기의 교훈은 이러한 오류가 표시되는 경우 게시하려는 URL을 추적하고 있는지 확인하는 것입니다.


답변

나도이 문제가 있었다.

제 경우에는 요청 된 작업에 대한 동사 제한과 관련이 있습니다. 여기서보기는 POST였지만 부분보기는 지원 GET되고 HEAD만 요청되었습니다 . (MVC 1.0에서) POST동사를 추가하면 AcceptVerbsAttribute문제가 해결되었습니다.


답변

IIS 로그에서 문제는 Googlebot이 POST를 시도하고 POST 전용 컨트롤러 작업에 대한 GET으로 인해 발생했습니다.

이 경우 Dmitriy 제안과 같은 404 처리를 권장합니다.


답변

현재 허용되는 답변은 예상대로 작동하지만 기능의 기본 사용 사례는 아닙니다. 대신 ASP.NET에서 정의한 기능을 사용하십시오. 제 경우에는 GET 및 POST를 제외한 모든 것을 거부했습니다.

  <system.webServer>
  <security>
      <requestFiltering>
          <verbs allowUnlisted="false">
              <add verb="GET" allowed="true"/>
              <add verb="POST" allowed="true"/>
          </verbs>
      </requestFiltering>
  </security>
 </system.webServer>

위의 코드 스 니펫을 사용하면 MVC는 404를 올바르게 반환합니다.