বিন্দু চরিত্র '।' এমপিসি ওয়েব এপিআই 2 তে যেমন এপিআই / লোক / এসএটিএফএফ.45287 এর অনুরোধের জন্য


106

আমি যে ইউআরএলটিকে কাজ করতে দেওয়ার চেষ্টা করছি সেগুলির একটিতে হ'ল : http://somedomain.com/api/people/staff.33311 (ঠিক যেমন শেষ সাইটগুলি এফএমএম তাদের আরএসটিএফএল এবং ওয়েবপেজ ইউআরএলগুলিতে সমস্ত ধরণের চিহ্নকে মঞ্জুরি দেয় , উদাহরণস্বরূপ " http://www.last.fm/artist/psy'aviah " হল LAST.FM এর জন্য একটি বৈধ url)।

কোন কাজগুলি দৃশ্যের অনুসরণ করে: - http://somedomain.com/api/people/ - যা সমস্ত লোককে ফিরিয়ে দেয় - http://somedomain.com/api/people/staff33311 - পাশাপাশি কাজ করবে, তবে আমি তা করি না ' মিটার পরে আমি ইউআরএলটি একটি "ডট" স্বীকার করতে চাইছি, নীচের উদাহরণের মতো - http://somedomain.com/api/people/staff.33311 - তবে এটি আমাকে একটি

HTTP Error 404.0 - Not Found
The resource you are looking for has been removed, had its name changed, or is temporarily unavailable.

আমি নিম্নলিখিত জিনিসগুলি সেট আপ করেছি:

  1. নিয়ন্ত্রক "পিপলস কন্ট্রোলার"

    public IEnumerable<Person> GetAllPeople()
    {
        return _people;
    }
    
    public IHttpActionResult GetPerson(string id)
    {
        var person = _people.FirstOrDefault(p => p.Id.ToLower().Equals(id.ToLower()));
        if (person == null)
            return NotFound();
    
        return Ok(person);
    }    
  2. WebApiConfig.cs

    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services
    
        // Web API routes
        config.MapHttpAttributeRoutes();
    
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }

আমি ইতিমধ্যে এই ব্লগপোস্টের সমস্ত টিপস অনুসরণ করার চেষ্টা করেছি http://www.hanselman.com/blog/ExperimentsInWackinessAllowingPenderntsAnglebracketAndOtherNaughtyThingsInTheASPNETIISRequestURL.aspx তবে এটি কার্যকর হবে না .. আমিও মনে করি এটি বেশ ক্লান্তিকর এবং আমি ভাবছি অন্য কোনওটি না থাকলে, ভাল এবং আরও সুরক্ষিত উপায়।

আমাদের আইডির অভ্যন্তরীণভাবে এটি রয়েছে, সুতরাং আমাদের বিন্দুতে কোনওভাবে বা অন্যভাবে ফিট করতে একটি সমাধান খুঁজে বের করতে হবে, সম্ভবত "স্টাইল" in তবে আমি ইউআরএলগুলির জন্য বিকল্প পরামর্শের জন্য উন্মুক্ত যদি প্রয়োজন হয় ...


10
কোনও উত্তর নয়, তবে কেন আপনি somedomain.com/api/people/staff.3331111 এর জন্য 404 পাচ্ছেন - ডিফল্টরূপে, আইআইএস এই ইউআরএলটি দেখে এবং এটি দেখে। একটি ফাইল এক্সটেনশন হিসাবে এবং স্থির ফাইল হ্যান্ডলারকে অনুরোধ করে আপনার এমভিসি এপিআইকে বাইপাস করে। আপনি যে উত্তরটি স্বীকার করেছেন (সমস্ত অনুরোধের জন্য সমস্ত পরিচালিত মডিউলগুলি চালাচ্ছেন) কাজ করে কারণ আপনি আইআইএসকে প্রতিটি অনুরোধকে এএসপি.নেট পাইপলাইন (তাই, আপনার নিয়ামকগণ) যেতে বাধ্য করেন
হেনরি সি

নিবিড়ভাবে সম্পর্কিত পোস্ট এখানে
আরবিটি

উত্তর:


104

আপনার web.configফাইলে নিম্নলিখিত সেটিংসটি আপনার সমস্যার সমাধান করবে:

<configuration>
    <system.webServer>
        <modules runAllManagedModulesForAllRequests="true" />

4
এটা কৌতুক করেছে। যদিও, এই বিকল্পটি সেট করে কোনও দুর্বলতা রয়েছে? কেন এটি স্ট্যান্ডার্ড আচরণ নয়?
ইয়ভেস শেল্পে

2
ঠিক আছে, কারো আগ্রহের জন্য: আমি দেখতে (কপিল Khandelwal দ্বারা উত্তর) লেখার সময়ে গৃহীত উত্তরে উত্তর এখানে দেওয়া হচ্ছে উপরে আমার প্রশ্ন: stackoverflow.com/questions/11048863/...
ইভস Schelpe

2
হ্যাঁ, এটি কাজ করেছে, অন্যদের বাস করেছে, আমি জানতে চাই যে এই কার্যকারিতাটির জন্য কোন বিশেষ মডিউলটির প্রয়োজন?
গ্রেগ জেড।

3
আমি যখন এটি চেষ্টা করেছি, কেবল তখনই পথটির শেষে '/' রেখে দিলে এটি কাজ করবে। কোন পরামর্শ কেন এটি? সাইড নোটে, নীচের উত্তরটি বিশেষত সমস্ত মডিউল চালানোর পরিবর্তে 'আরলআরটিংিং মোডিউল' যুক্ত করে, এটি আমার পক্ষেও কাজ করেছিল, যদিও এখনও কাজটি শেষ হওয়ার জন্য এটির জন্য '/' প্রয়োজন এই সমস্যাটি রয়েছে।
নিকোলাজ ড্যাম লারসেন

10
stackoverflow.com/a/12151501/167018 আপনি উদ্বিগ্ন যদি হয় (এবং আইনসঙ্গতভাবে তাই) সক্রিয় runAllManagedModulesForAllRequests কর্মক্ষমতা প্রভাব নিয়ে এ খুঁজছেন মূল্য।
হেনরি সি

140

URL এর http://somedomain.com/api/people/staff.33311/পরিবর্তে একটি স্ল্যাশ সহ প্রবাহিত করুন http://somedomain.com/api/people/staff.33311


3
@ অগাস্টিনমিরিলস আমার উত্তরটিকে প্রকৃত উত্তরের চেয়ে অনেক বেশি বিবেচনা করা যেতে পারে, এটি আপনার প্রশ্নের ব্যাখ্যার উপর নির্ভর করে।
ড্যানি ভারোড 13

5
ইউটিএল বিভাগের শেষে / লোক / সদস্য হিসাবে বিন্দুটি থাকা অবস্থায় এটি কাজ করে না।
আই

2
না, আমি যদি শেষের দিকে স্ল্যাশ না চাই তবে কী করব ?! এটি প্রয়োজন হবে না
জোশ এম

1
@JoshM। এটি একটি কার্যতালিকা, আমি এএসপি.এনইটি লিখিনি। এছাড়াও, স্ল্যাশ অনুরোধটিকে প্রভাবিত করে না। এটি google.com/my query goes here/বনাম হিসাবে আপনার উদ্দেশ্যগুলি আরও স্পষ্ট করতে সহায়তা করে doesgoogle.com/subDomain my query goes here
ড্যানি ভারোড

1
হ্যাঁ এটি সর্বোত্তম আপনার ওয়েলকনফিগটি পরিবর্তন করতে হবে না।
টিমোথি গঞ্জালেজ

35

আমি খুঁজে পেয়েছি যে স্ট্যান্ডার্ডটি আমার জন্য সমস্যাটি সমাধান করার আগে নিম্নলিখিতটি যুক্ত করা :ExtensionlessUrlHandler

<add name="ExtensionlessUrlHandler-Integrated-4.0-ForApi"
     path="api/*"
     verb="*"
     type="System.Web.Handlers.TransferRequestHandler"
     preCondition="integratedMode,runtimeVersionv4.0" />

আপনার আইডিই (আমার ক্ষেত্রে ভিজ্যুয়াল স্টুডিও) আপনার সাইটের কনফিগারেশনটি পরিচালনা করছে তবে নামটি আসলে এতটা গুরুত্বপূর্ণ বলে মনে করি না।

এইচ / টি থেকে https://stackoverflow.com/a/15802305/264628


আমি এটি স্ট্যান্ডার্ড লাইন 'পরে' যুক্ত করেছি এবং এটিও দুর্দান্ত কাজ করেছে।
জালাল এল শায়ের

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
Uri এর

2
পূর্বের জন্য ধন্যবাদ, কারণ এটি পরে কাজ করে না!
মেসে

আমি বিশ্বাস করি যে মডিউলগুলি ঘোষণার ক্রমে চালিত হয়, তাই আরও জেনেরিকগুলির আগে সর্বদা আরও নির্দিষ্ট (বা আরও গুরুত্বপূর্ণ) রাখুন।
ব্রায়ানস

24

আমি আসলে কী করছি তা আমি জানি না, তবে পূর্ববর্তী উত্তরটি খানিকটা খেলার পরে আমি আরেকজনের সাথে উপস্থিত হলাম, সম্ভবত আরও উপযুক্ত, সমাধান:

<system.webServer>
<modules>
    <remove name="UrlRoutingModule-4.0" />
    <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" />
</modules>
</system.webServer>

ধন্যবাদ, আমি জানি না এটি কী করছে তবে এটি অন্যান্য সমাধানের চেয়ে ভাল দেখাচ্ছে।
টমাস

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

1
এটি তালিকার শেষের স্থানান্তর নয়, এটি পূর্বনির্ধারিত পূর্বশর্ত অপসারণ যে এই মডিউলটি কেবল পরিচালিত হ্যান্ডলারের জন্য চালিত। ডিফল্ট কনফিগারেশনটি এই ফর্ম্যাটটি ব্যবহার করে:<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="managedHandler" />
থেটা-ফিশ

ধন্যবাদ - যা আচরণটি ব্যাখ্যা করবে।
গ্রেগ জেড।

8

আমি দেখেছি যে কেবলমাত্র runAllManagedModulesForAllRequestsবৈশিষ্ট্যটি সেট করার চেয়ে আমার আরও কিছু করা দরকার true। এক্সটেনশনহীন ইউআরএল হ্যান্ডলারটি সমস্ত পাথ দেখার জন্য কনফিগার করা হয়েছে তাও আমাকে নিশ্চিত করতে হয়েছিল। এছাড়াও, আপনি যুক্ত করতে পারেন আরও একটি বোনাস কনফিগারেশন সেটিংস যা কিছু ক্ষেত্রে সহায়তা করবে। এখানে আমার কর্মরত ওয়েব কনফিগ:

<system.web>
    <httpRuntime relaxedUrlToFileSystemMapping="true" />
</system.web>
<system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
    <handlers>
        <remove name="WebDAV" />
        <remove name="OPTIONSVerbHandler" />
        <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
        <add name="ExtensionlessUrlHandler-Integrated-4.0"  path="*" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
</system.webServer>

দ্রষ্টব্য, বিশেষভাবে, ExtensionlessUrlHandler-Integrated-4.0এর pathবৈশিষ্ট্যটি *যেমন সেট করা হয়েছে *.(উদাহরণস্বরূপ) opposed


আমি শুধু অল্পে পেয়েছিলাম path="*."। শুধু কৌতূহলী, লোকেরা এটি সেট করার কারণ কী path="*."?
জাস্টিনপি 8

প্রকৃতপক্ষে, আমি এটিকে পরিবর্তন করেছি path="*"এবং একটি সমস্যা ছিল কারণ আমরা আমাদের ওয়েবএপিআইয়ের সাথে পাশাপাশি একটি ডকুমেন্টেশন সাইট হোস্ট করছি এবং সেই সাইটটি .jpg, .png, এবং এক্সটেনশন সহ অন্যান্য ফাইলগুলির সাথে সমস্যা ছিল।
জাস্টিনপি 8

@ JustinP8 আপনি কি সেট করেছেন <modules runAllManagedModulesForAllRequests="true" />? এটি করা উচিত। নেট এই স্ট্যাটিক ফাইলগুলি হ্যান্ডেল করে।
জোশ এম।

1
হ্যাঁ. আমি তা করে ক্ষতবিক্ষত। যদিও আমি সত্যিই এটি পছন্দ করি না কারণ এখন সমস্ত স্ট্যাটিক ফাইলগুলি .NET পাইপলাইন দিয়ে যায়। ভাগ্যক্রমে, এটি একটি ওয়েবএপিআই পরিষেবা হিসাবে, কেবলমাত্র API ডক্স / সহায়ক সাইটের জন্য সোয়াগার এবং স্বশবাকল স্টাফগুলি প্রভাবিত হয়।
জাস্টিনপি 8

আমি এটি সমস্ত স্থিতিশীল ফাইল অনুরোধ ভঙ্গ পেয়েছি। ত্রুটি 500. আমি রানআল ম্যানেজড করেছি ... সত্যতে সেট করা আছে।
স্যাম

2

আমি এই পরিস্থিতিতে আটকে গিয়েছিলাম তবে / URL এর শেষে সংযোজন করা আমার পক্ষে পরিষ্কার মনে হয়নি look

সুতরাং কেবল ওয়েবকনফিগ handlers ট্যাগটিতে নীচে যুক্ত করুন এবং আপনি যেতে ভাল হবে।

<add name="Nancy" path="api" verb="*" type="Nancy.Hosting.Aspnet.NancyHttpRequestHandler" allowPathInfo="true" />

আপনি কী ব্যাখ্যা করতে পারেন ন্যান্সি কী এবং এটি প্রকল্পের অন্তর্ভুক্ত লাইব্রেরি কিনা? ধন্যবাদ!
ব্লু করুন

1

আমি দেখতে পেলাম যে উভয় পথেই আমার পক্ষে কাজ করে: হয় রানআলম্যানেজডমডিউলস ফরআলরকেষ্টগুলি সত্য হিসাবে সেট করা বা এক্সটেনশনহীন উড়ানহ্যান্ডলারকে নিম্নলিখিত হিসাবে যুক্ত করুন। অবশেষে আমি এক্সটেনশন ইউআরএলএন্ডহ্যান্ডলার যুক্ত করা বেছে নিই যেহেতু রানআল ম্যানেজডমডিউলসফোরআলরেইকেষ্টগুলির সাইটে পারফরম্যান্স প্রভাব থাকে।

<handlers>
  <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
  <remove name="OPTIONSVerbHandler" />
  <remove name="TRACEVerbHandler" />
  <remove name="WebDAV" />
  <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*" verb="*" 
       type="System.Web.Handlers.TransferRequestHandler" 
       preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>

1

আমি এটি Web.config ফাইলটিতে ব্যবহার করব:

<add name="ManagedSpecialNames" path="api/people/*" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

মানক "এক্সটেনশনহীন উড়ানহ্যান্ডলার" এর আগে।

উদাহরণস্বরূপ আমার ক্ষেত্রে আমি এটি এখানে রেখেছি:

<handlers>
  <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
  <remove name="OPTIONSVerbHandler" />
  <remove name="TRACEVerbHandler" />
  <add name="ManagedFiles" path="api/people/*" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
  <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>

সুতরাং আপনি অ্যাপ্লিকেশন ডিরেক্টরি ট্রিতে ফাইল হিসাবে মানক ব্যবস্থাপনার পরিবর্তে এই জাতীয় প্যাটার্নের ইউআরএলগুলি আপনার দ্বারা পরিচালিত হতে বাধ্য করেন।


0

আমি খুব একই সমস্যার মুখোমুখি হয়েছি এবং আমি যে পরিস্থিতিতে ছিলাম যেখানে আইআইএস এবং ওয়েবসাইট কনফিগারেশন সম্পর্কিত সেটিংসের সাথে আমার খেলার কথা ছিল না। সুতরাং আমাকে কোড কোডে পরিবর্তন করে এটি কাজ করতে হয়েছিল।

সাধারণ বিষয়টি হ'ল আপনি যখন ইউআরএল থেকে কিছু ইনপুট পান এবং ক্রিয়াকলাপের স্ট্রিং বা ইউআরএল টুকরা হিসাবে অ্যাকশন পদ্ধতিতে প্যারামিটারগুলিতে কিছু যুক্তি সরবরাহ করেন তখন সাধারণ URL হ'ল আপনার নিয়ামক।

public class GetuserdetailsbyuseridController : ApiController
{
     string getuserdetailsbyuserid(string userId)
     {
        //some code to get user details
     }
}

নীচের ইউআরএলটি দেখুন যেখানে ব্যবহারকারী তার ব্যক্তিগত বিবরণ পেতে তার ব্যবহারকারীর আইডিতে প্রবেশ করে:

http://mywebsite:8080/getuserdetailsbyuserid/foo.bar

যেহেতু আপনাকে কেবল সার্ভার থেকে কিছু তথ্য আনতে হবে আমরা HTTP GETক্রিয়া ব্যবহার করি । ব্যবহার করার সময়GETকলগুলি করার সময় যেকোন ইনপুট প্যারামিটারগুলি কেবলমাত্র ইউআরএল টুকরোতে পাস করা যেতে পারে।

সুতরাং আমার সমস্যা সমাধানের জন্য আমি আমার ক্রিয়াটির http ক্রিয়াটি পরিবর্তিত করেছি POST। এইচটিটিপি ক্রিয়ায় POSTকোনও ব্যবহারকারী বা অ-ব্যবহারকারীর ইনপুট দেহে পাস করার সুবিধা রয়েছে। সুতরাং আমি একটি জেএসওএন ডেটা তৈরি করেছি এবং এটিকে HTTP POSTঅনুরোধের শিরোনামে দিয়েছি :

{
  "userid" : "foo.bar"
}

নীচের মত আপনার পদ্ধতির সংজ্ঞা পরিবর্তন করুন:

public class GetuserdetailsbyuseridController : ApiController
{
     [Post]
     string getuserdetailsbyuserid([FromBody] string userId)
     {
        //some code to get user details
     }
}

দ্রষ্টব্য : কখন GETক্রিয়া ব্যবহার করতে হবে এবং কখন POSTক্রিয়াটি এখানে ব্যবহার করতে হবে সে সম্পর্কে আরও ।


আপনি যদি একটি REST এপিআই তৈরি করছেন তবে উপযুক্ত সমাধান নয়।
মোস্তফা ওজতুরক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.