ওয়েব এপিআই পুট অনুরোধটি এইচটিপিপি 405 পদ্ধতি অনুমোদিত নয় ত্রুটি উত্পন্ন করে


134

PUTআমার ওয়েব এপিআই-তে পদ্ধতিতে এখানে কল রয়েছে - পদ্ধতির তৃতীয় লাইন (আমি একটি এএসপি.নেট এমভিসি সম্মুখ প্রান্ত থেকে ওয়েব এপিআই কল করছি):

এখানে চিত্র বর্ণনা লিখুন

client.BaseAddressহয় http://localhost/CallCOPAPI/

এখানে contactUri:

এখানে চিত্র বর্ণনা লিখুন

এখানে contactUri.PathAndQuery:

এখানে চিত্র বর্ণনা লিখুন

এবং অবশেষে, এখানে আমার 405 প্রতিক্রিয়া:

এখানে চিত্র বর্ণনা লিখুন

আমার ওয়েব এপিআই প্রকল্পের ওয়েবএপিপি.কনফিগ এখানে রয়েছে:

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

            config.Routes.MapHttpRoute(
                name: "DefaultApiGet",
                routeTemplate: "api/{controller}/{action}/{regionId}",
                defaults: new { action = "Get" },
                constraints: new { httpMethod = new HttpMethodConstraint("GET") });

            var json = config.Formatters.JsonFormatter;
            json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
            config.Formatters.Remove(config.Formatters.XmlFormatter);

আমি পথ চলে পরার যে নিচে stripping চেষ্টা করেছি PutAsJsonAsyncকরতে string.Format("/api/department/{0}", department.Id)এবং string.Format("http://localhost/CallCOPAPI/api/department/{0}", department.Id)কোন ভাগ্য সঙ্গে।

আমি কেন ৪০৫ ত্রুটি পাচ্ছি তার কারও কি ধারণা আছে?

হালনাগাদ

অনুরোধ অনুসারে, এখানে আমার বিভাগের নিয়ামক কোডটি রয়েছে (আমি আমার সম্মুখ সমাপ্তির প্রকল্পের জন্য বিভাগীয় নিয়ামক কোড এবং সেইসাথে ওয়েবএপিআইয়ের জন্য বিভাগ অ্যাপি কন্ট্রোলার কোড উভয়ই পোস্ট করব):

ফ্রন্ট এন্ড ডিপার্টমেন্ট কন্ট্রোলার

namespace CallCOP.Controllers
{
    public class DepartmentController : Controller
    {
        HttpClient client = new HttpClient();
        HttpResponseMessage response = new HttpResponseMessage();
        Uri contactUri = null;

        public DepartmentController()
        {
            // set base address of WebAPI depending on your current environment
            client.BaseAddress = new Uri(ConfigurationManager.AppSettings[string.Format("APIEnvBaseAddress-{0}", CallCOP.Helpers.ConfigHelper.COPApplEnv)]);

            // Add an Accept header for JSON format.
            client.DefaultRequestHeaders.Accept.Add(
                new MediaTypeWithQualityHeaderValue("application/json"));
        }

        // need to only get departments that correspond to a Contact ID.
        // GET: /Department/?regionId={0}
        public ActionResult Index(int regionId)
        {
            response = client.GetAsync(string.Format("api/department/GetDeptsByRegionId/{0}", regionId)).Result;
            if (response.IsSuccessStatusCode)
            {
                var departments = response.Content.ReadAsAsync<IEnumerable<Department>>().Result;
                return View(departments);
            }
            else
            {
                LoggerHelper.GetLogger().InsertError(new Exception(string.Format(
                    "Cannot retrieve the list of department records due to HTTP Response Status Code not being successful: {0}", response.StatusCode)));
                return RedirectToAction("Index");
            }

        }

        //
        // GET: /Department/Create

        public ActionResult Create(int regionId)
        {
            return View();
        }

        //
        // POST: /Department/Create
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create(int regionId, Department department)
        {
            department.RegionId = regionId;
            response = client.PostAsJsonAsync("api/department", department).Result;
            if (response.IsSuccessStatusCode)
            {
                return RedirectToAction("Edit", "Region", new { id = regionId });
            }
            else
            {
                LoggerHelper.GetLogger().InsertError(new Exception(string.Format(
                    "Cannot create a new department due to HTTP Response Status Code not being successful: {0}", response.StatusCode)));
                return RedirectToAction("Edit", "Region", new { id = regionId });
            }
        }

        //
        // GET: /Department/Edit/5

        public ActionResult Edit(int id = 0)
        {
            response = client.GetAsync(string.Format("api/department/{0}", id)).Result;
            Department department = response.Content.ReadAsAsync<Department>().Result;
            if (department == null)
            {
                return HttpNotFound();
            }
            return View(department);
        }

        //
        // POST: /Department/Edit/5

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit(int regionId, Department department)
        {
            response = client.GetAsync(string.Format("api/department/{0}", department.Id)).Result;
            contactUri = response.RequestMessage.RequestUri;
            response = client.PutAsJsonAsync(string.Format(contactUri.PathAndQuery), department).Result;
            if (response.IsSuccessStatusCode)
            {
                return RedirectToAction("Index", new { regionId = regionId });
            }
            else
            {
                LoggerHelper.GetLogger().InsertError(new Exception(string.Format(
                    "Cannot edit the department record due to HTTP Response Status Code not being successful: {0}", response.StatusCode)));
                return RedirectToAction("Index", new { regionId = regionId });
            }
        }

        //
        // GET: /Department/Delete/5

        public ActionResult Delete(int id = 0)
        {
            response = client.GetAsync(string.Format("api/department/{0}", id)).Result;
            Department department = response.Content.ReadAsAsync<Department>().Result;

            if (department == null)
            {
                return HttpNotFound();
            }
            return View(department);
        }

        //
        // POST: /Department/Delete/5

        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public ActionResult DeleteConfirmed(int regionId, int id)
        {
            response = client.GetAsync(string.Format("api/department/{0}", id)).Result;
            contactUri = response.RequestMessage.RequestUri;
            response = client.DeleteAsync(contactUri).Result;
            return RedirectToAction("Index", new { regionId = regionId });
        }
    }
}

ওয়েব এপিআই বিভাগ অ্যাপিকন্ট্রোলার

namespace CallCOPAPI.Controllers
{
    public class DepartmentController : ApiController
    {
        private CallCOPEntities db = new CallCOPEntities(HelperClasses.DBHelper.GetConnectionString());

        // GET api/department
        public IEnumerable<Department> Get()
        {
            return db.Departments.AsEnumerable();
        }

        // GET api/department/5
        public Department Get(int id)
        {
            Department dept = db.Departments.Find(id);
            if (dept == null)
            {
                throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
            }

            return dept;
        }

        // this should accept a contact id and return departments related to the particular contact record
        // GET api/department/5
        public IEnumerable<Department> GetDeptsByRegionId(int regionId)
        {
            IEnumerable<Department> depts = (from i in db.Departments
                                             where i.RegionId == regionId 
                                             select i);
            return depts;
        }

        // POST api/department
        public HttpResponseMessage Post(Department department)
        {
            if (ModelState.IsValid)
            {
                db.Departments.Add(department);
                db.SaveChanges();

                HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, department);
                return response;
            }
            else
            {
                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
            }
        }

        // PUT api/department/5
        public HttpResponseMessage Put(int id, Department department)
        {
            if (!ModelState.IsValid)
            {
                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
            }

            if (id != department.Id)
            {
                return Request.CreateResponse(HttpStatusCode.BadRequest);
            }

            db.Entry(department).State = EntityState.Modified;

            try
            {
                db.SaveChanges();
            }
            catch (DbUpdateConcurrencyException ex)
            {
                return Request.CreateErrorResponse(HttpStatusCode.NotFound, ex);
            }

            return Request.CreateResponse(HttpStatusCode.OK);
        }

        // DELETE api/department/5
        public HttpResponseMessage Delete(int id)
        {
            Department department = db.Departments.Find(id);
            if (department == null)
            {
                return Request.CreateResponse(HttpStatusCode.NotFound);
            }

            db.Departments.Remove(department);

            try
            {
                db.SaveChanges();
            }
            catch (DbUpdateConcurrencyException ex)
            {
                return Request.CreateErrorResponse(HttpStatusCode.NotFound, ex);
            }

            return Request.CreateResponse(HttpStatusCode.OK, department);
        }
    }
}

[HttpPut]অ্যাকশন পদ্ধতির সংজ্ঞা দেওয়ার আগে আপনার ব্যবহার করা উচিত নয় ? ( [HttpPost]এবং [HttpDelete]যথাযথ যেখানে উপযুক্ত)
ক্রিস প্র্যাট

@ ক্রিসপ্র্যাট ঠিক পরিষ্কার করার জন্য, আপনি মানে [HttpPut]ওয়েবএপিআই নিয়ন্ত্রক (এপিআইকন্ট্রোলার) লাগিয়েছেন, তাই না? কারণ বিভাগের জন্য ফ্রন্ট এন্ড কন্ট্রোলারের (সম্পাদনা পদ্ধতি) একটি [HttpPost]বৈশিষ্ট্য রয়েছে।
মাইক

1
@ ক্রিসপ্রাট মানসমূহ নিয়ন্ত্রণকারী (ওয়েবপিআই টেমপ্লেট নিয়ে আসে এমন) [HttpPut]এর পুট / পোস্ট / মুছতে পদ্ধতিতে ইত্যাদি বৈশিষ্ট্য নেই ..
মাইক

হ্যাঁ, আমি যুক্তিসঙ্গতভাবে নিশ্চিত যে এটির ওয়েব এপিআই পাশের এটির প্রয়োজন needs ব্যক্তিগতভাবে, আমি সর্বদা ওয়েব API স্টাফের জন্য কেবলমাত্র অ্যাট্রিবিউটরাউটিং ব্যবহার করেছি, তাই আমার স্মরণশক্তিটি কিছুটা স্কেচিযুক্ত।
ক্রিস প্র্যাট

স্পষ্টতই এটি ওয়েবডিএভি জিনিস ছিল .. এটি ইনস্টল করা হয়নি তা নিশ্চিত করার জন্য আমি আমার স্থানীয় আইআইএস (উইন্ডোজ বৈশিষ্ট্যগুলি) পরীক্ষা করেছিলাম এবং এটি বলে যে এটি নেই ... যাইহোক আমি এর উত্তর পোস্ট করেছি, মূলত আমার ওয়েবের ভিতরে মডিউল ওয়েবডিএভি সরিয়েছি removing .config।
মাইক

উত্তর:


304

সুতরাং, আমি ওয়েবডিএভি নামক জিনিসটি ইনস্টল না করে আছে তা নিশ্চিত করার জন্য আমি উইন্ডোজ বৈশিষ্ট্যগুলি পরীক্ষা করেছি এবং এটি বলেছে যে আমি তা করি নি। যাইহোক, আমি এগিয়ে গিয়েছিলাম এবং নিম্নলিখিতগুলি আমার ওয়েবকনফিগের মধ্যে রেখেছি (সামনের প্রান্ত এবং ওয়েবএপিআই উভয়ই, সুনিশ্চিত হওয়ার জন্য), এবং এটি এখন কাজ করে। আমি এটি ভিতরে রেখেছি <system.webServer>

<modules runAllManagedModulesForAllRequests="true">
    <remove name="WebDAVModule"/> <!-- add this -->
</modules>

অতিরিক্তভাবে, web.configহ্যান্ডলারগুলিতে প্রায়শই নিম্নলিখিতগুলি যুক্ত করা প্রয়োজন । বাবাকে ধন্যবাদ

<handlers>
    <remove name="WebDAV" />
    ...
</handlers>

2
হাহা ... হ্যাঁ ... আমি হাল ছেড়ে দিতে চলেছিলাম। তাই হ্যা. ওয়েবডিএভি অবশ্যই আপনার সক্রিয় করা উচিত applicationhost.config। খুশী তুমি ঠিক করেছ
অ্যারন

9
আপনার এটিও যুক্ত করতে হতে পারে:<handlers><remove name="WebDAV" />...
বাবাক

14
এটি কেবলমাত্র আমার WebApi web.config এ যুক্ত হয়েছে এবং এটি কার্যকর হয়েছে।
ফোর্ডি

যদিও আইই 10 তে এটি এই কনফিগারটি ছাড়াই দুর্দান্ত কাজ করেছে, এটি ক্রোম ব্রাউজারে কাজ করতে আমাকে কেবল ওয়েবএপি ওয়েবকনফিগেই করতে হয়েছিল।
ডেনিস আর

1
সত্যিই বিরক্তিকর এই সমস্যার উত্তরের জন্য ধন্যবাদ। কেন এটি প্রথম স্থানে ঘটে?
স্কট উইলসন

23

ওয়েবড্যাভ-শেমবডাভ .. .. নিশ্চিত করুন আপনি সঠিকভাবে আইডি দিয়ে url তৈরি করেছেন। এটি http://www.fluff.com/api/Fluff?id=MyID এর মতো প্রেরণ করবেন না , http://www.fluff.com/api/Fluff/MyID এর মতো প্রেরণ করুন

যেমন।

PUT http://www.fluff.com/api/Fluff/123 HTTP/1.1
Host: www.fluff.com
Content-Length: 11

{"Data":"1"}

এটি আমার বলকে একটি ক্ষুদ্র চিরকাল ধরে, সম্পূর্ণ বিব্রতকর অবস্থায় ফেলেছিল।


3
আমার জন্য একটি অতিরিক্ত বল বাস্টার: পুট ক্রিয়াগুলি আদিম ধরণের পরামিতিগুলিতে ডেটা বাঁধতে পারে না। আমাকে বদলে public int PutFluffColor(int Id, int colorCode)যেতে হয়েছিলpublic int PutFluffColor(int Id, UpdateFluffColorModel model)
জোশ নয়ে

4
আশা করি আমি ওয়েবড্যাভ-শেমবডাভ
নোয়েল

1
8 ঘন্টারও বেশি কাজের সমাধানে পৌঁছানোর পরে, প্রত্যেকেই ওয়েবকনফিগকে সুপারিশ করছে যে এটি এত আশ্চর্যজনক কোনও দেহ এমনকি এই সম্ভাবনা সম্পর্কে কথা বলেনি।
সাইফান

22

এটি আপনার যুক্ত করুন web.config। আপনার আইআইএস বলতে হবে PUT PATCH DELETEএবং এর OPTIONSঅর্থ কী তা জানা দরকার । এবং যা IHttpHandlerপ্রার্থনা করতে হবে।

<configuation>
    <system.webServer>
    <handlers>
    <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
    <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
    <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
    <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
    <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="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>
</configuration>

এছাড়াও আপনার ওয়েবডিএভি সক্ষম করা হয়নি তা পরীক্ষা করে দেখুন।


আমি ইতিমধ্যে এটি আছে। আমি ধরে নিচ্ছি এটি ওয়েব এপিআই প্রকল্পে রাখা হবে, আমার প্রথম প্রান্তের এমভিসি প্রকল্প নয়, তাই না?
মাইক

আমার ওয়েবডিএভি ইনস্টল নেই। অতিরিক্ত হিসাবে, আপনি কি বলছেন যে উপরের ওয়েবকনফিগ কোডটি প্রকল্পের ওয়েবকনফিগে স্থাপন করা দরকার যা ওয়েব এপিআইতে কল করে?
মাইক

এটি আসলে উভয় ওয়েবকনফাইজেই রয়েছে ... :(
মাইক

ওহ না ... আমি ভেবেছিলাম আপনি কোনও এমভিসি প্রকল্প থেকে একটি ওয়েব এপিআই প্রকল্পটি উল্লেখ করছেন।
অ্যারন

1
আপনি কি ডিপার্টমেন্টাল কন্ট্রোলারের কোড তালিকা পোস্ট করতে পারেন? এটার সবগুলো. সমস্যাটি আপনার ওয়েব এপিআই প্রকল্পের মধ্যে রয়েছে এবং এটি কীভাবে পরিচালনা করতে হয় তা জানে না PUT, এটিই 405 এর অর্থ means জিইটি কাজ করে তা পরীক্ষা করে দেখুন, কেবল রাউটিংকে বাতিল করতে। পুনশ্চ. স্ক্রিনশটের চেয়ে পেস্ট কোড অনুলিপি করার চেষ্টা করুন। পিপিএস, ব্যবহার করবেন না Task.Result, আপনি কিছু পরিস্থিতিতে সম্পর্কযুক্ত থ্রেডিংয়ের সমস্যা পাবেন। পরিবর্তে পুরো পদ্ধতিটি async অপেক্ষায় পরিণত করুন। উল্লেখ না করে এটি সিঙ্ক্রোনাস, মাল্টিথ্রেডেড ব্লকড কোড তৈরি করে (একক থ্রেডের চেয়ে ধীর)।
আরন

14

আমি আইআইএস 8.5 তে একটি এএসপি.এনইটি এমভিসি 5 অ্যাপ্লিকেশন চালাচ্ছি। আমি এখানে পোস্ট করা সমস্ত প্রকারের চেষ্টা করেছি এবং এটি আমার web.configচেহারাগুলির মতো:

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
        <remove name="WebDAVModule"/> <!-- add this -->
    </modules>  
    <handlers>      
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="WebDAV" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="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>

আমি আমার সার্ভার থেকে ওয়েবড্যাব আনইনস্টল করতে পারিনি কারণ আমার প্রশাসকের কোনও অধিকার নেই। এছাড়াও, কখনও কখনও আমি method not allowed.css এবং .js ফাইলগুলি পেয়ে যাচ্ছিলাম । শেষ অবধি, উপরের কনফিগারেশনটি দিয়ে সবকিছু আবার কাজ শুরু করে।


5

[ফ্রিবিডি] দিয়ে অ্যাকশন প্যারামগুলির মধ্যে একটি সজ্জিত করা আমার জন্য সমস্যাটি সমাধান করেছে:

public async Task<IHttpActionResult> SetAmountOnEntry(string id, [FromBody]int amount)

তবে এএসপি.এনইটি পদ্ধতি প্যারামিটারে জটিল অবজেক্ট ব্যবহার করা হলে এটি সঠিকভাবে অনুমান করবে:

public async Task<IHttpActionResult> UpdateEntry(string id, MyEntry entry)

1

এর আর একটি কারণ হতে পারে যদি আপনি "আইডি" এর জন্য ডিফল্ট পরিবর্তনশীল নামটি ব্যবহার না করেন যা আসলে: আইডি।


0

আমার ক্ষেত্রে ত্রুটি 405 স্থির হ্যান্ডলার দ্বারা একই নামের ফোল্ডারের ("~ / চিত্র") এর সাথে বিরোধের কারণে স্থির হ্যান্ডলার দ্বারা ডেকে আনা হয়েছিল।


0

আপনি আইআইএস-এর জন্য বিশেষত জিইউআই থেকে ওয়েবডাভ মডিউলটি ম্যানুয়ালি সরিয়ে ফেলতে পারেন।
1) II গুলি যান।
2) সংশ্লিষ্ট সাইটে যান।
3) "হ্যান্ডলার
ম্যাপিংস " খুলুন 4) ডাউন স্ক্রোল করুন এবং ওয়েবডাভ মডিউলটি নির্বাচন করুন। এটিতে ডান ক্লিক করুন এবং এটি মুছুন।

দ্রষ্টব্য: এটি ওয়েব অ্যাপ্লিকেশনটির আপনার ওয়েবকনফাইগকেও আপডেট করবে।


-1

আপনার ক্লায়েন্ট অ্যাপ্লিকেশন এবং সার্ভার অ্যাপ্লিকেশন অবশ্যই একই ডোমেনের অধীনে থাকতে হবে, উদাহরণস্বরূপ:

ক্লায়েন্ট - লোকালহোস্ট

সার্ভার - লোকালহোস্ট

এবং না :

ক্লায়েন্ট - লোকালহোস্ট: 21234

সার্ভার - লোকালহোস্ট


2
আমি তাই মনে করি না। পরিষেবা তৈরির লক্ষ্যটি অন্য ডোমেন থেকে কল করা
ওজান বায়রাম

আপনি ক্রস ডোমেন অনুরোধের কথা ভাবছেন, যা আপনাকে সার্ভার থেকে 200 প্রতিক্রিয়া জানাবে, তবে ব্রাউজারটি তার "কোনও ক্রস ডোমেন অনুরোধগুলি" নিয়মটি প্রয়োগ করবে না এবং প্রতিক্রিয়া স্বীকার করবে না। প্রশ্নটি 405 "মঞ্জুরিপ্রাপ্ত পদ্ধতি নয়" প্রতিক্রিয়াটিকে উল্লেখ করছে, এটি একটি আলাদা সমস্যা।
জোশ নোয়ে 16

সিওআরএস 405 প্রদান করবে "অনুমোদিত নয় পদ্ধতি", উদাহরণস্বরূপ: অনুরোধ ইউআরএল: testapi.nottherealsite.com/api/Reporting/RunReport অনুরোধ পদ্ধতি: বিকল্পসমূহ স্থিতি কোড: 405 পদ্ধতি অনুমোদিত নয় দয়া করে এখানে পড়ুন stackoverflow.com/questions/12458444/…
লেভ কে।

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