আন্তঃসত্মত এসপ নেট এমভিসি ব্যতিক্রম: "কন্ট্রোলার এক্সওয়াইজেডে পাবলিক অ্যাকশন পদ্ধতি এবিসি পাওয়া যায়নি” "


92

আমি অবিচ্ছিন্নভাবে ব্যতিক্রম পাচ্ছি যে বলছে যে asp.net এমভিসি অ্যাকশন পদ্ধতিটি খুঁজে পাচ্ছে না। ব্যতিক্রম এখানে:

নিয়ামক 'শুন.ফর্ম। ওয়েলবি.কমট্রোলারস.ক্রিসকন্ট্রোলার'-এ একটি' পাবলিক অ্যাকশন পদ্ধতি 'পূরণ করুন could

আমি মনে করি আমার কাছে রাউটিংটি সঠিকভাবে সেট আপ হয়েছে কারণ এই অ্যাপ্লিকেশনটি বেশিরভাগ সময় কাজ করে। নিয়ন্ত্রকের ক্রিয়া পদ্ধতিটি এখানে।

[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.Http ধারণা: নিয়ামক 'শুন.ফর্ম.সাহাবি.কম্প্রোলারস.ক্রিসকন্ট্রোলার' তে একটি সর্বজনীন কর্ম পদ্ধতি 'ফিল' খুঁজে পাওয়া যায়নি। সিটিতে System.Web.Mvc.Controller.HandleUnعلومAction (স্ট্রিং অ্যাকশননাম) এ: \ dev \ তৃতীয় পক্ষ \ MvcDev \ src \ SystemWebMvc \ Mvc \ Controller.cs: Line at 197. System.Web.Mvc.Controller.Exute : \ দেব \ থার্ডপার্টি \ এমভিসিডিভ \ এসসিআরসি \ সিস্টেমওয়েবএমভিসি \ এমভিসি \ কন্ট্রোলার.সি: লাইন 164 এ সিস্টেম.ওয়েব.এমভিসি.কন্ট্রোলারবেস.এক্সেকিউট (অনুরোধকন্টেক্সট অনুরোধকন্টেক্সট) সি: \ দেব \সিভিসিসিভিসিভিসিভিসিভিসিভি সিস্টেম কন্ট্রোলারবেস.সি: লাইন 76. সিস্টেমে.বি.বি.বি.সি.সি. কন্ট্রোলারবেস.সিস্টেম.ওয়েব.এমভিসি.আইকন্ট্রোলার.এক্সেকিউট (রিকোয়েস্টকন্টেক্সট অনুরোধকন্টেক্সট) সি: \ দেব \ থার্ডপার্টি \ এমভিসিডিএভ \ এসসিআরসি W সিস্টেমবিবেসিভিসি লাইন এমসিসিএলসিআরসিআরসি: সিটিতে System.Web.Mvc.MvcHandler.ProcessRequest (HttpContextBase httpContext) এ:

এখানে আমার ফিল্টারগুলির উদাহরণ রয়েছে তারা সবাই একইভাবে কাজ করে:

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);
    }
}

ধন্যবাদ, ক্রিস


28
আমার একটি অনুরূপ সমস্যা ছিল যা আমি মনে করি এখানে লক্ষ্য করার মতো কারণ উপরের ব্যতিক্রম অনুসন্ধান করার সময় গুগলে এটিই প্রথম ফলাফল ছিল। আমার আবেদনটি একটি অবৈধ ফর্ম জমা দেওয়ার সময় এই ব্যতিক্রমটিকে ছুঁড়ে ফেলেছে। এটি সেই পৃষ্ঠাটির কারণে যা রেন্ডার অ্যাকশনকে কল করে (পুনরায়) রেন্ডার করছিল এবং আংশিক দৃষ্টিভঙ্গি রেন্ডার করার জন্য যে ক্রিয়াকলাপটি আহ্বান করা হয়েছিল তাকে এইচটিটিপিগেট অ্যাট্রিবিউট দিয়ে চিহ্নিত করা হয়েছিল, এই বৈশিষ্ট্যটি সরিয়ে দিয়ে সমস্যার সমাধান হয়েছে।
s1mm0t

4
আমি এই আচরণটিও লক্ষ্য করেছি - আংশিকভিউ ফলাফলগুলি ফিরে আসা নিয়ামক পদ্ধতিতে কোনও এইচটিপি বৈশিষ্ট্য প্রয়োগ না করা সম্ভবত সেরা।
স্টুয়ার্ট

4
@ s1mm0t: ঠিক আছে। আমার ক্ষেত্রে, তার মন্তব্য সমস্যার সমাধান করেছে
মাজদাক শোজাই

@ s1mm0t - দয়া করে আমাকে তাত্ক্ষণিকভাবে আপনার ডাক ঠিকানাটি প্রেরণ করুন। এই ক্রিসমাসের জন্য আপনার কাছে স্কোচের একটি বোতল চলছে !!!!!
শেন

আমরা সাদৃশ্যযুক্ত কিছু পেয়েছি: কিছু কিছু ক্ষেত্রে সেই ক্রিয়াটিতে পুনর্নির্দেশের পরিবর্তে অন্য ক্রিয়াকলাপটি ফিরিয়ে দেওয়া সমস্যা তৈরি করছিল। প্রাক্তন PostSomething { return HomePageActionMethod() }যেখানে ব্যর্থ হয় PostSomething { return RedirectToAction(nameof(HomePageActionMethod)); }। (আমাদের ক্ষেত্রে দৃশ্য আপত্তিকর কর্ম একটি ভিন্ন নিয়ামক মধ্যে অবস্থিত হয়, এবং সম্ভবতঃ যে নিয়ামক সম্পূর্ণরূপে কলিং প্রথম পদ্ধতি সঙ্গে সক্রিয়া করা হয় না।
jleach

উত্তর:


62

আমরা উত্তর খুঁজে পেয়েছি। আমরা আমাদের ওয়েব লগগুলিতে সন্ধান করেছি। এটি দেখিয়েছিল যে আমরা কিছু অদ্ভুত HTTP ক্রিয়া (ক্রিয়া / পদ্ধতি) যেমন বিকল্পগুলি, প্রোফাইন্ড এবং হেড পাচ্ছি receiving

এটি এই কয়েকটি ব্যতিক্রমের কারণ বলে মনে হচ্ছে। এটি অন্তর্বর্তী কেন ছিল তা ব্যাখ্যা করে।

আমরা কার্ল.এক্সই সরঞ্জাম দিয়ে সমস্যাটি পুনরুত্পাদন করেছি:

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

আমরা যে ফিক্সটি ব্যবহার করেছি তা হ'ল ওয়েবকনফিগটিতে একটি অনুমোদন বিভাগ যুক্ত করা:

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

4
আমরা এটিও পেয়েছি যে বটগুলি মাঝে মাঝে লিঙ্কগুলি সন্ধান করতে - এমনকি জাভাস্ক্রিপ্ট - এমনকি আপনার সাইট ক্রল করবে। এরপরে তারা এই ইউআরআইগুলিতে ভুল এইচটিটিপি ক্রিয়া সহ অনুরোধগুলি প্রেরণের চেষ্টা করে। উদাহরণস্বরূপ, যদি আপনার কিছু ক্রিয়াকলাপের জন্য jQuery কল থাকে - যেমন / কিছু-ক্রিয়া এবং এই পদ্ধতির কোনও পোস্টের প্রয়োজন হয় তবে বটটি একটি জিইটি প্রেরণের চেষ্টা করতে পারে, যার ফলে এই ত্রুটিটি প্রদর্শিত হবে। আপনার ওয়েব লগগুলি অবশ্যই এটি নিশ্চিত হয়ে সহায়তা করতে পারে this এমনকি আমরা গুগলবোট এটি করতে দেখছি।
জেকেজগর্ডন

আমি কেবল লাইভ সার্ভারে (আইআইএস 7.5) এই একই ত্রুটিটি পাচ্ছি। স্থাপনাটি আমার বিকাশ মেশিনের পাশাপাশি অন্য একটি সমর্থন মেশিনে দুর্দান্ত কাজ করে। এই ক্রিয়াগুলি যুক্ত করা এবং এইচটিপিপিট সরানো সমস্যার সমাধান করে নি। আরও কিছু পরামর্শ দয়া করে।
bjan

আগত হেড অনুরোধগুলি অস্বীকার করার একটি বিকল্প, আপনি একটি উপযুক্ত প্রতিক্রিয়া পরিবেশন করতে চাইতে পারেন। স্ট্যাকওভারফ্লো.com
জন স্নাইডার

15

আমাদের অনুরূপ সমস্যা ছিল, তবে দেখা গেছে যে এটি ঘটছে কারণ কোনও ব্যবহারকারী তার লগইন শেষ হওয়ার পরে কোনও নিয়ামককে পোস্ট করছিল। এরপরে সিস্টেমটি লগইন স্ক্রিনে পুনঃনির্দেশিত। এটিতে লগইন করার পরে ব্যবহারকারী ইউআরএলটিতে পুনঃনির্দেশিত করার পরে ব্যবহারকারী পোস্ট করার চেষ্টা করছিল, তবে এবার পরিবর্তে এটি একটি জিইটি অনুরোধ করছে এবং সেইজন্য একটি ক্রিয়াটি খুঁজে পাচ্ছে না যা একটি [এইচটিপিপোস্ট] বৈশিষ্ট্যের সাথে চিহ্নিত করা হয়েছিল।


আমার বর্তমান সমাধানটি সর্বদা কোনও ক্রিয়াকলাপের শেষে সূচক ক্রিয়ায় পুনর্নির্দেশ করা যতদূর সম্ভব। বিলম্বিত প্রতুত্তরের জন্য দুঃখিত।
জোহান স্ট্রিডম

7

আমি Asp.net এমভিসি তে একই সমস্যা পেয়েছি। এই ত্রুটি - 404 পাওয়া যায় নি। আমি এইভাবে সমস্যার সমাধান করি - এই কোডটি MyAppControllerBase(এমভিসি) মধ্যে রেখে দিন

    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();
    }

6

আমাদের অ্যাপ্লিকেশনটিতে কেবল আমাদের একই সমস্যা ছিল এবং আমি এটি একটি জাভাস্ক্রিপ্ট / জ্যাকোয়ারি ইস্যুতে সনাক্ত করতে সক্ষম হয়েছি। আমাদের অ্যাপ্লিকেশনটিতে লিঙ্কগুলি এইচটিএমএল.অ্যাকশনলিংক () ব্যবহার করে সংজ্ঞায়িত করা হয়েছে যা পরে jquery দ্বারা পোষ্টগুলিতে ওভাররাইড করা হয়।

প্রথমে আমরা লিঙ্কটি সংজ্ঞায়িত করেছি:

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

পরে আমরা আমাদের সামপোস্টএভেন্টহ্যান্ডলার ফাংশন দিয়ে ডিফল্ট ক্রিয়াকে ওভাররাইড করি:

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

এটি আমাদের এমভিসি ক্রিয়াকে আঘাত করছে যা একটি এইচটিপিপোস্ট ফিল্টার ছিল:

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

আমরা যা পেয়েছি তা হ'ল বেশিরভাগ সময় এটি দুর্দান্ত কাজ করে। যাইহোক, কিছু ধীর পৃষ্ঠার লোডগুলিতে (বা সত্যই দ্রুত ব্যবহারকারী), ব্যবহারকারী jquery before (ডকুমেন্ট) এর আগে লিঙ্কটি ক্লিক করছিলেন ready পোস্টিং

আমরা চাই না যে ব্যবহারকারী সেই ইউআরএলটি পান, তাই ফিল্টার অপসারণ করা আমাদের পক্ষে বিকল্প নয়। পরিবর্তে আমরা কেবল অ্যাকশন লিঙ্কের অনক্লিক ইভেন্টটি সরাসরি তারে ফেলেছি (এটি কাজ করার জন্য আমাদের সামারপোস্টএভেন্টহ্যান্ডলার () কিছুটা পরিবর্তন করতে হয়েছিল):

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

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

সুতরাং, গল্পটির নৈতিকতা কমপক্ষে আমাদের কাছে হ'ল আপনি যদি এই ত্রুটিগুলি দেখছেন তবে আপনি যে URL টি পোস্ট করছেন বলে মনে করেন তা নিশ্চিত করে নিন এবং নিশ্চিত হন যে আপনি are


আপনি যখন এইচটিএমএল হাইপারলিঙ্ক থেকে পোস্ট করেন তখন সাধারণভাবে আপনার সতর্ক হওয়া উচিত। ব্যবহারকারীকে অন্য পৃষ্ঠায় নিয়ে যাওয়ার জন্য হাইপারলিঙ্ক বিদ্যমান (HTTP পেতে) এবং এইচটিএমএল বোতামগুলির একটি ফর্ম (HTTP পোস্ট) জমা দিতে হবে।
স্টিভি_সি

2

আমারও এই সমস্যা ছিল।

আমার ক্ষেত্রে এটি অনুরোধকৃত ক্রিয়াটিতে ক্রিয়া বিধিনিষেধের সাথে সম্পর্কিত ছিল, যেখানে দৃষ্টিভঙ্গিটি কেবলমাত্র POSTসমর্থিত GETএবং HEADকেবলমাত্র আংশিক দৃশ্যের জন্য অনুরোধ করা হয়েছিল । যোগ করা হচ্ছে POSTক্রিয়া থেকে AcceptVerbsAttribute(MVC 1.0 মধ্যে) সমস্যা সমাধান।


2

আইআইএস লগ থেকে আমাদের সমস্যা Googlebot POST চেষ্টা করার মাধ্যমে এবং একটি পোষ্ট কেবলমাত্র নিয়ামক পদক্ষেপের জন্য একটি GET এর ফলে ঘটেছিল।

এই ক্ষেত্রে আমি দিমিত্রি পরামর্শ মত 404 হ্যান্ডল করার পরামর্শ দিচ্ছি।


1

বর্তমানে গৃহীত উত্তর প্রত্যাশিত হিসাবে কাজ করে তবে বৈশিষ্ট্যের জন্য প্রাথমিক ব্যবহারের ক্ষেত্রে নয় isn't পরিবর্তে ASP.NET দ্বারা সংজ্ঞায়িত বৈশিষ্ট্যটি ব্যবহার করুন। আমার ক্ষেত্রে, আমি জিইটি এবং পোস্ট ব্যতীত সমস্ত কিছুই অস্বীকার করেছি:

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

উপরের কোড স্নিপেটের সাথে, এমভিসি সঠিকভাবে একটি 404 ফিরিয়ে দেবে


0

এটা হওয়া উচিত নয়

routes.MapRoute(
        "SchoonForm",
        "Form/Fill/{subscriberId}",
        new { controller = "Chris", action = "Fill" },

এছাড়াও, আপনার ফিল্টারগুলি কি করে? তারা কী অ্যাকশনমেথডসিলিটরঅ্যাট্রিবিউটের মতো অ্যাকশনকে আড়াল করতে পারে না?


এটি একটি সম্পাদনার ভুল। আমি নিরীহদের রক্ষা করার চেষ্টা করছিলাম।
ক্রিস শুন

তারা কিছু পরামিতি পপুলেশন। উদাহরণস্বরূপ, ইউজারআইডিফিল্টারটি সেশন / কুকি / ইত্যাদি থেকে ব্যবহারকারী আইডি পাওয়ার জন্য সহায়ক It এটি প্রথম প্যারামিটারটি জনপ্রিয় করে। পোস্টটি অন্তর্ভুক্ত করার জন্য আমি সম্পাদনা করব।
ক্রিস শুন

0

আমি কিউকিউ ফাইল আপলোডের সাথে একই সমস্যা রয়েছে

পোস্ট ক্রিয়াকলাপটি যখন /Document/Saveআমি ব্যতিক্রম পাই তখন একটি নিয়ন্ত্রক 'প্রজেক্ট.কন্ট্রোলার্স oc ডকুমেন্টকন্ট্রোলার' তে একটি সর্বজনীন কর্ম পদ্ধতি 'সেভ' পাওয়া যায়নি।

তবে পোস্ট অ্যাকশন /Document/Save/হলে পোস্টটি সঠিক এবং কাজ করে!

Saveশ্বর বাঁচাবেন / ?


0

আমার মূল কারণটি মন্তব্যে উল্লিখিত মতটির সাথে মিল ছিল।

আমি ajaxSubmittingএকটি বোতাম ক্লিকের উপর একটি ফর্ম ছিল । ফর্ম ক্ষেত্রগুলির মধ্যে একটি টাইপ ছিল Date। তবে ক্লায়েন্ট এবং সার্ভার মেশিনের মধ্যে তারিখের ফর্ম্যাটগুলির পার্থক্যের কারণে এটি নিয়ামকটিতে POST পদ্ধতি কার্যকর করে না। সার্ভারটি একটি 302প্রতিক্রিয়া ফিরে পাঠিয়েছে এবং তারপরে GETআবার একই পদ্ধতির জন্য একটি অনুরোধ পাঠিয়েছে ।

তবে নিয়ন্ত্রকের ক্রিয়াটি HttpPostঅ্যাট্রিবিউট দিয়ে সজ্জিত করা হয়েছিল এবং তাই এটি পদ্ধতিটি খুঁজে না পেয়ে একটি 404প্রতিক্রিয়া ফেরত পাঠিয়েছে ।

আমি কেবল কোডটি ঠিক করেছি যাতে তারিখের ফর্ম্যাটগুলিতে অমিলটি কোনও ত্রুটির কারণ না ঘটায় এবং সমস্যাটি স্থির হয়েছিল।


0

[HttpGet]বৈশিষ্ট্যগুলি সরান এবং এটি কাজ করবে :)


এই ত্রুটিগুলি "সমাধান" করার সময়, সম্ভাবনা হ'ল আপনি (বা আপনার আগে কেউ) [HttpGet]উদ্দেশ্যগুলিতে সেই বৈশিষ্ট্যগুলি সেখানে রেখেছিলেন , যাতে কোনও অন্য VERB- এর মাধ্যমে ক্রিয়াকলাপগুলি আহ্বান করা থেকে বিরত রাখতে হয়
নিক অরল্যান্ডো

0

অ্যাঙ্গুলারজ, এমভিসি এবং {{ইমেজপথ} with এর যে কারওরও সমস্যা রয়েছে এটির জন্য চিত্র src বৈশিষ্ট্যগুলিতে সন্নিবেশ লিখুন, যেমন:

"কন্ট্রোলারে একটি সর্বজনীন কর্ম পদ্ধতি '{{চিত্রপথ}। ਪਿਛਲੇ.png' পাওয়া যায়নি"

সমাধানটি হ'ল এসআরসি-র পরিবর্তে এনজি-এসসিআর ব্যবহার করা।

আশা করি এটি কাউকে সাহায্য করবে :)


প্রায় এক বছর পরে, আমি এটি :) টিএনএক্স খুঁজছিলাম!
ভার্থোসা

0

দেখুন যে প্রশ্নটির URL টি ব্রাউজ করা ত্রুটিটি পুনরুত্পাদন করার জন্য যথেষ্ট। এটি যদি কর্মটি কেবলমাত্র একটি পোস্ট পদক্ষেপ হিসাবে সংজ্ঞায়িত করা হয়। এটি করার ফলে আপনি ইচ্ছামত ত্রুটিটি পুনরুত্পাদন করতে পারবেন।

যে কোনও ক্ষেত্রে, আপনি বিশ্বব্যাপী নীচের মতো ত্রুটিটি পরিচালনা করতে পারেন। এখানে আরও একটি উত্তর যা রেফারেন্সগুলি HandleUnknownActionশুধুমাত্র খারাপ ক্রিয়াকলাপের নামগুলি সহ URL টি পরিচালনা করে, খারাপ নিয়ামকের নাম নয়। নিম্নলিখিত পদ্ধতির উভয় পরিচালনা করে।

এটি আপনার বেস নিয়ামকটিতে যুক্ত করুন (এখানে বাদ দেওয়া কোড দেখুন):

public ActionResult Error(string errorMessage)
{
    return View("Error");  // or do something like log the error, etc.
}

গ্লোবাল.এক্সএক্স। সি-তে একটি বৈশ্বিক ব্যতিক্রম হ্যান্ডলার যুক্ত করুন যা উপরের পদ্ধতিটিকে কল করে বা ধরা পড়া 404 ত্রুটির সাথে আপনি যা কিছু করতে চান তা করে:

void Application_Error(object sender, EventArgs e)
{
    Exception ex = Server.GetLastError();  // get the exception object
    HttpException httpException = ex as HttpException;

    if (httpException != null && httpException.GetHttpCode() == 404)  // if action not found
    {
        string errorMessage = "The requested page was not found.";

        RouteData routeData = new RouteData();
        routeData.Values.Add("controller", "Base");
        routeData.Values.Add("action", "Error");
        routeData.Values.Add("errorMessage", errorMessage);

        Server.ClearError();
        Response.TrySkipIisCustomErrors = true;

        // Go to our custom error view.
        IController errorController = new BaseController();
        errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.