অ-ওকে সাড়া না দেওয়ার জন্য IHttpActionResult সহ সামগ্রী ফিরে আসুন


184

কোনও ওয়েব এপিআই 2 কন্ট্রোলার থেকে ফিরে আসার জন্য, প্রতিক্রিয়াটি ঠিক আছে (অবস্থা 200) ঠিক থাকলে আমি প্রতিক্রিয়া সহ সামগ্রীটি ফিরে আসতে পারি:

    public IHttpActionResult Get()
    {
        string myResult = ...
        return Ok(myResult);
    }

যদি সম্ভব হয় তবে আমি এখানে অন্তর্নির্মিত ফলাফলের প্রকারগুলি যখন এখানে সম্ভব ব্যবহার করতে চাই: https://msdn.microsoft.com/en-us/library/system.web.http.results(v=vs.118).aspx

আমার প্রশ্নটি হল, অন্য ধরণের প্রতিক্রিয়ার জন্য (২০০ নয়) আমি কীভাবে এটির সাথে একটি বার্তা (স্ট্রিং) ফিরিয়ে দিতে পারি? উদাহরণস্বরূপ, আমি এটি করতে পারি:

    public IHttpActionResult Get()
    {
       return InternalServerError();
    }

তবে এটি নয়:

    public IHttpActionResult Get()
    {
       return InternalServerError("Message describing the error here");
    }

আদর্শভাবে আমি এটিকে সাধারণীকরণ করতে চাই যাতে IHttpActionResult এর যে কোনও বাস্তবায়নের সাথে আমি একটি বার্তা পাঠাতে পারি।

আমার কি এটি করা দরকার (এবং নিজের প্রতিক্রিয়া বার্তাটি তৈরি করব):

    public IHttpActionResult Get()
    {
       HttpResponseMessage responseMessage = ...
       return ResponseMessage(responseMessage);
    }

বা এর চেয়ে ভাল উপায় আর কি?


এটি সম্পর্কে কীভাবে: স্ট্যাকওভারফ্লো
প্রশ্নগুলি


@ মিলেন, আপনাকে ধন্যবাদ এরকম কিছু কাজ করতে পারে। যে অংশটি আমি পছন্দ করি না তা হ'ল প্রতিটি বিদ্যমান প্রয়োগের জন্য আমি ব্যবহার করতে সক্ষম হতে চাই তার জন্য আলাদা আইএইচটিপিএ্যাকশন রেজাল্ট বাস্তবায়ন তৈরি করা দরকার।
mayabelle

@ রিক, না, প্যারামিটারটি একটি ব্যতিক্রম। আমি একটি বার্তাটি স্ট্রিং হিসাবে সেট করতে চাই। এছাড়াও, এটি এমন আরও সাধারণ ক্ষেত্রে সম্বোধন করে না যেখানে কোডটি অভ্যন্তরীণ সার্ভার ত্রুটি নাও হতে পারে।
mayabelle

3
@ মায়াবেল: আপনি কি শামিল ইয়াকুপভের উত্তর দেখেছেন? এটি অনেক সহজ এবং সংক্ষিপ্ত যে স্বীকৃত উত্তর।
ইসহাক

উত্তর:


419

আপনি এটি ব্যবহার করতে পারেন:

return Content(HttpStatusCode.BadRequest, "Any object");

1
সংক্ষিপ্ত এবং সহজ সমাধান। আরও কোড থাকার অর্থ আরও বাগ এবং সময় সাপেক্ষ রক্ষণাবেক্ষণ।
থমাস.বেঞ্জ

6
আমি যখন এটি চেষ্টা করে দেখছি , সেখানে code(যে কোডটি একটি স্ট্রিং) এর ফিরে আসা মানটি return Content(HttpStatusCode.OK, code)"যা অপ্রত্যাশিত, "\"value\""এটির কোনও কারণ আছে? যেমন: প্রত্যাবর্তিত মানটি আমি এমভিসি 5 ব্যবহার করছি
দেজা

2
যদি আপনাকে এপিআইকন্ট্রোলার শ্রেণীর বাইরে থেকে এটি করার প্রয়োজন হয় তবে আপনি ব্যবহার করতে পারেন: নতুন নেগোসিয়েটেড কনটেন্ট রেজাল্ট <টি> (কোড, নতুন টি (...), নিয়ামক)
ফেরান

আমি কি এটি ক্লাস লাইব্রেরি থেকে ফিরিয়ে দিতে পারি? আমার কি রেফারেন্স দরকার?
টুলকিট

54

আপনি ব্যবহার করতে পারেন HttpRequestMessagesExtensions.CreateErrorResponse ( System.Net.Httpতাই মত, নামস্থান):

public IHttpActionResult Get()
{
   return ResponseMessage(Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Message describing the error here"));
}

ওয়েব এপিআই এর সামগ্রী আলোচনার সুযোগ নেওয়ার অনুরোধের ভিত্তিতে প্রতিক্রিয়া তৈরি করা ভাল।


6
অনুরোধ.ক্রিয়েটআররআরস্পোনস একটি এইচটিটিপিআরএসপোনসম্যাসেজ দেয়, আইএইচটিপিএকশনরেসাল্ট নয়। আপনি যা বর্ণনা করছেন তা হ'ল এইচটিপিআরস্পোনমেসেজ তৈরির জন্য ভাল অনুশীলন তবে আমার প্রশ্নের সমাধান করে না। যাই হোক ধন্যবাদ!
mayabelle

@ মায়াবেল আপনি IHttpActionResult কংক্রিট তৈরি করতে পারেন এবং এই কোডগুলিকে এইভাবে মোড়ানো করতে পারেন:
Quoc Nguyen

1
এটি আমার পক্ষে কাজ করেছে তবে আমি অনুরোধটি তৈরি করেছি reআর তৈরি করুন রিস্পনস যাতে ত্রুটিটি বার্তা কী এর পরিবর্তে স্ট্রিং হিসাবে প্রদর্শিত হয়।
রসায়নবিদ

আমি একটি ত্রুটি পাচ্ছি, স্নিপেট ব্যর্থ হচ্ছে। এটি বলেছে 'অনুরোধ' বাতিল। আমি অনুরোধটি ব্যবহার করার চেষ্টা করছি re ক্রিটআরস্পোন @ ব্যবহারকারী 1620220
শীনা

@ শিনাআগ্রাওয়াল এই কোডটি কেবলমাত্র একটি এইচটিটিপি অনুরোধের প্রসঙ্গে কার্যকর করা যেতে পারে। যদি ApiController.Requestনাল হয় তবে এর অর্থ হ'ল আপনি সঠিক প্রসঙ্গে নন, বা আপনার ওয়েবএপিআই আর্কিটেকচারে কিছু নষ্ট হয়েছে।
ব্যবহারকারী 1620220

35

আমি নিম্নলিখিত সমাধানের সাথে শেষ করেছিলাম:

public class HttpActionResult : IHttpActionResult
{
    private readonly string _message;
    private readonly HttpStatusCode _statusCode;

    public HttpActionResult(HttpStatusCode statusCode, string message)
    {
        _statusCode = statusCode;
        _message = message;
    }

    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        HttpResponseMessage response = new HttpResponseMessage(_statusCode)
        {
            Content = new StringContent(_message)
        };
        return Task.FromResult(response);
    }
}

... যা এটির মতো ব্যবহার করা যেতে পারে:

public IHttpActionResult Get()
{
   return new HttpActionResult(HttpStatusCode.InternalServerError, "error message"); // can use any HTTP status code
}

উন্নতির জন্য আমি পরামর্শের জন্য উন্মুক্ত। :)


1
শামিল ইয়াকুপভের উত্তরটি সেরা উত্তর তবে কেবল এপি কন্ট্রোলার শ্রেণীর ভিতরে থেকেই - এটি "নতুন নতুন নেগোসিয়েটেড কনসেন্টালাইসাল্ট <টি> (কোড, নতুন টি (...), নিয়ামক))" এর মতো কিছু হিসাবে নতুন করে লিখতে হবে "বাইরে থেকে ব্যবহার করার জন্য নিয়ামক শ্রেণি। সেক্ষেত্রে উপরের মতো এর মতো সমাধান আরও পঠনযোগ্য হতে পারে।
ইথারম্যান

16

আপনি এটি করতে পারেন:

return InternalServerError(new Exception("SOME CUSTOM MESSAGE"));

1
হ্যাঁ তবে এই বার্তাটির পাঠ্য ফিরে পেতে খুব কষ্ট হচ্ছে
ইউজারস্টেভ

7

যে কেউ রিসপন্স ম্যাসেজের সাথে কোনও স্ট্যাটাসকোড সহ যে কোনও কিছু ফেরত দিতে আগ্রহী:

//CreateResponse(HttpStatusCode, T value)
return ResponseMessage(Request.CreateResponse(HttpStatusCode.XX, object));

7

ASP.NET ওয়েব এপিআই 2 এ আপনি মোড়ানো পারেন ResponseMessageএকটি ResponseMessageResult :

public IHttpActionResult Get()
{
   HttpResponseMessage responseMessage = ...
   return new ResponseMessageResult(responseMessage);
}

কিছু ক্ষেত্রে এটি পছন্দসই ফলাফল পাওয়ার সহজতম উপায় হতে পারে, যদিও সাধারণত সিস্টেম.ওয়েব.এইচটিপি.সেসল্টের বিভিন্ন ফলাফল ব্যবহার করা ভাল ।



2

আমি এই পোস্টটি পড়ার সুপারিশ করব। প্রস্তাবিত হিসাবে বিদ্যমান এইচটিটিপিআরস্পোন ব্যবহার করার জন্য প্রচুর উপায় রয়েছে তবে আপনি যদি ওয়েব এপি 2 ব্যবহার করতে চান তবে কিছু বিল্ট-ইন আইএইচটিপিএक्शनআরসাল্ট বিকল্পগুলি ব্যবহার করে দেখুন যেমন

return Ok() 

অথবা

return NotFound()

ওয়েব অপি কন্ট্রোলারদের জন্য সঠিক ফেরতের প্রকারটি চয়ন করুন


2

এইচটিটিপি কোড সমর্থন সহ আরও বিশদ উদাহরণ সি # তে সংজ্ঞায়িত হয়নি HttpStatusCode

public class MyController : ApiController
{
    public IHttpActionResult Get()
    {
        HttpStatusCode codeNotDefined = (HttpStatusCode)429;
        return Content(codeNotDefined, "message to be sent in response body");
    }
}

ContentApiControllerনিয়ন্ত্রকের বেস, বিমূর্ত শ্রেণিতে সংজ্ঞায়িত একটি ভার্চুয়াল পদ্ধতি । নীচে হিসাবে ঘোষণা দেখুন:

protected internal virtual NegotiatedContentResult<T> Content<T>(HttpStatusCode statusCode, T value);

1

@ মায়াবেল আপনি IHttpActionResult কংক্রিট তৈরি করতে পারেন এবং এই কোডগুলিকে এইভাবে মোড়ানো করতে পারেন:

public class NotFoundPlainTextActionResult : IHttpActionResult
{
    public NotFoundPlainTextActionResult(HttpRequestMessage request, string message)
    {
        Request = request;
        Message = message;
    }

    public string Message { get; private set; }
    public HttpRequestMessage Request { get; private set; }

    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        return Task.FromResult(ExecuteResult());
    }

    public HttpResponseMessage ExecuteResult()
    {
        var response = new HttpResponseMessage();

        if (!string.IsNullOrWhiteSpace(Message))
            //response.Content = new StringContent(Message);
            response = Request.CreateErrorResponse(HttpStatusCode.NotFound, new Exception(Message));

        response.RequestMessage = Request;
        return response;
    }
}

0

আমারও একই সমস্যা ছিল। আমি আমার এপিআই কন্ট্রোলারের জন্য কাস্টম ফলাফল তৈরি করতে চাই, তাদের পছন্দ করতে চাই return Ok("some text");

তারপরে আমি এটি করেছি: 1) সিঙ্গেলোটনের সাথে কাস্টম ফলাফলের ধরণ তৈরি করুন

public sealed class EmptyResult : IHttpActionResult
{
    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        return Task.FromResult(new HttpResponseMessage(System.Net.HttpStatusCode.NoContent) { Content = new StringContent("Empty result") });
    }
}

2) নতুন পদ্ধতি সহ কাস্টম নিয়ামক তৈরি করুন:

public class CustomApiController : ApiController
{
    public IHttpActionResult EmptyResult()
    {
        return new EmptyResult();
    }
}

এবং তারপরে আমি এগুলিকে আমার নিয়ন্ত্রকগুলিতে কল করতে পারি:

public IHttpActionResult SomeMethod()
    {
       return EmptyResult();
    }

0

এই উত্তরটি শামিল ইয়াকুপভ উত্তরের উপর ভিত্তি করে স্ট্রিংয়ের পরিবর্তে বাস্তব বস্তু সহ।

using System.Dynamic;

dynamic response = new ExpandoObject();
response.message = "Email address already exist";

return Content<object>(HttpStatusCode.BadRequest, response);

1
বিষয়বস্তু <টি> খুব দরকারী
শেষটি ট্রিবিউনাল

0

ব্যতিক্রমগুলির জন্য, আমি সাধারণত করি

 catch (Exception ex)
        {
            return InternalServerError(new ApplicationException("Something went wrong in this request. internal exception: " + ex.Message));
        }

0

উপরের জিনিসগুলি সত্যই সহায়ক।

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

  public class Response
    {
        /// <summary>
        /// Gets or sets a value indicating whether this instance is success.
        /// </summary>
        /// <value>
        /// <c>true</c> if this instance is success; otherwise, <c>false</c>.
        /// </value>
        public bool IsSuccess { get; set; } = false;

        /// <summary>
        /// Actual response if succeed 
        /// </summary>
        /// <value>
        /// Actual response if succeed 
        /// </value>
        public object Data { get; set; } = null;

        /// <summary>
        /// Remark if anythig to convey
        /// </summary>
        /// <value>
        /// Remark if anythig to convey
        /// </value>
        public string Remark { get; set; } = string.Empty;
        /// <summary>
        /// Gets or sets the error message.
        /// </summary>
        /// <value>
        /// The error message.
        /// </value>
        public object ErrorMessage { get; set; } = null;


    }  




[HttpGet]
        public IHttpActionResult Employees()
        {
            Response _res = new Response();
            try
            { 
                DalTest objDal = new DalTest(); 
                _res.Data = objDal.GetTestData();
                _res.IsSuccess = true;
                return Ok<Response>(_res);
            }
            catch (Exception ex)
            {
                _res.IsSuccess = false;
                _res.ErrorMessage = ex;
                return ResponseMessage(Request.CreateResponse(HttpStatusCode.InternalServerError, _res )); 
            } 
        }

আপনি যদি কোন পরামর্শ দিতে স্বাগত জানাই :)


-1

দেরী উত্তরটির জন্য দুঃখিত কেন আপনি সাধারণ ব্যবহার করেন না

return BadRequest("your message");

আমি এটি আমার সমস্ত IHttpActionResultত্রুটির জন্য এটি ভালভাবে কাজ করার জন্য ব্যবহার করি

এখানে ডকুমেন্টেশন রয়েছে: https://msdn.microsoft.com/en-us/library/system.web.http.apicontroller.badrequest(v=vs.118).aspx


7
কারণ সমস্ত ত্রুটিগুলি খারাপ অনুরোধের ফলাফল নয়, সুতরাং একটি 400প্রতিক্রিয়া অনুপযুক্ত হবে। 500উদাহরণস্বরূপ ওপি বিশেষত প্রতিক্রিয়া জানিয়েছিলেন।
ব্যবহারকারী 1620220

হ্যাঁ এটি কেবলমাত্র BadRequest এর মাধ্যমেই সম্ভব অন্য প্রকারের বার্তা যুক্তিটি গ্রহণ করবেন না
benraay
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.