ASP.NET Core ส่งคืน JSON พร้อมรหัสสถานะ


153

ฉันกำลังมองหาวิธีที่ถูกต้องในการส่งคืน JSON ด้วยรหัสสถานะ HTTP ใน. NET Core Web API controller ของฉัน ฉันใช้มันแบบนี้:

public IHttpActionResult GetResourceData()
{
    return this.Content(HttpStatusCode.OK, new { response = "Hello"});
}

นี่เป็นแอปพลิเคชัน 4.6 MVC แต่ตอนนี้ด้วย. NET Core ฉันดูเหมือนจะไม่มีสิ่งนี้ที่IHttpActionResultฉันมีActionResultและใช้งานเช่นนี้:

public ActionResult IsAuthenticated()
{
    return Ok(Json("123"));
}

แต่การตอบสนองจากเซิร์ฟเวอร์นั้นแปลกเหมือนดังภาพด้านล่าง:

ป้อนคำอธิบายรูปภาพที่นี่

ฉันแค่ต้องการให้ตัวควบคุม Web API ส่งคืน JSON ด้วยรหัสสถานะ HTTP เหมือนที่ฉันทำใน Web API 2


1
เมธอด "ok" คืนค่า 200 เป็นรหัสสถานะ วิธีที่กำหนดไว้ล่วงหน้าครอบคลุมกรณีทั่วไปทั้งหมด ที่จะกลับมา 201 (หัว + ตั้งทรัพยากรใหม่), คุณใช้CreatedAtRouteวิธีการอื่น ๆ
Tseng

คำตอบ:


191

รุ่นพื้นฐานที่สุดที่ตอบสนองด้วย a JsonResultคือ:

// GET: api/authors
[HttpGet]
public JsonResult Get()
{
    return Json(_authorRepository.List());
}

อย่างไรก็ตามสิ่งนี้จะไม่ช่วยแก้ไขปัญหาของคุณเนื่องจากคุณไม่สามารถจัดการกับรหัสการตอบสนองของคุณเองได้อย่างชัดเจน

วิธีที่จะได้รับผลการควบคุมสถานะคือคุณต้องกลับมาActionResultซึ่งเป็นที่ที่คุณสามารถใช้ประโยชน์จากStatusCodeResultประเภท

ตัวอย่างเช่น:

// GET: api/authors/search?namelike=foo
[HttpGet("Search")]
public IActionResult Search(string namelike)
{
    var result = _authorRepository.GetByNameSubstring(namelike);
    if (!result.Any())
    {
        return NotFound(namelike);
    }
    return Ok(result);
}

หมายเหตุทั้งสองตัวอย่างข้างต้นมาจากคำแนะนำที่ดีจากเอกสารของ Microsoft: การจัดรูปแบบข้อมูลการตอบสนอง


สิ่งพิเศษ

ปัญหาที่ฉันเจอบ่อยๆคือฉันต้องการการควบคุม WebAPI ที่ละเอียดยิ่งขึ้นแทนที่จะไปกับการกำหนดค่าเริ่มต้นจากแม่แบบ "โครงการใหม่" ใน VS

มาทำให้แน่ใจว่าคุณมีพื้นฐานบางอย่างอยู่ ...

ขั้นตอนที่ 1: กำหนดค่าบริการของคุณ

เพื่อให้ ASP.NET Core WebAPI ของคุณตอบสนองกับ JSON Serialized Object พร้อมการควบคุมรหัสสถานะอย่างสมบูรณ์คุณควรเริ่มต้นด้วยการทำให้แน่ใจว่าคุณได้รวมAddMvc()บริการในConfigureServicesวิธีการของคุณตามปกติStartup.csแล้ว

สิ่งสำคัญคือให้สังเกตว่าAddMvc()จะรวมฟอร์แมตอินพุต / เอาต์พุตสำหรับ JSON โดยอัตโนมัติพร้อมกับการตอบสนองต่อคำขอประเภทอื่น

หากโครงการของคุณต้องการการควบคุมเต็มรูปแบบและคุณต้องการกำหนดบริการของคุณอย่างเคร่งครัดเช่นวิธีที่ WebAPI ของคุณจะทำงานกับประเภทคำขอต่างๆรวมถึงapplication/jsonและไม่ตอบสนองต่อคำขอประเภทอื่น ๆ (เช่นคำขอเบราว์เซอร์มาตรฐาน) คุณสามารถกำหนดด้วยตนเอง รหัสต่อไปนี้:

public void ConfigureServices(IServiceCollection services)
{
    // Build a customized MVC implementation, without using the default AddMvc(), instead use AddMvcCore().
    // https://github.com/aspnet/Mvc/blob/dev/src/Microsoft.AspNetCore.Mvc/MvcServiceCollectionExtensions.cs

    services
        .AddMvcCore(options =>
        {
            options.RequireHttpsPermanent = true; // does not affect api requests
            options.RespectBrowserAcceptHeader = true; // false by default
            //options.OutputFormatters.RemoveType<HttpNoContentOutputFormatter>();

            //remove these two below, but added so you know where to place them...
            options.OutputFormatters.Add(new YourCustomOutputFormatter()); 
            options.InputFormatters.Add(new YourCustomInputFormatter());
        })
        //.AddApiExplorer()
        //.AddAuthorization()
        .AddFormatterMappings()
        //.AddCacheTagHelper()
        //.AddDataAnnotations()
        //.AddCors()
        .AddJsonFormatters(); // JSON, or you can build your own custom one (above)
}

คุณจะสังเกตเห็นว่าฉันได้รวมวิธีการในการเพิ่มตัวจัดรูปแบบอินพุต / เอาท์พุตของคุณเองในกรณีที่คุณอาจต้องการตอบสนองต่อรูปแบบการจัดลำดับอื่น ๆ (protobuf, thrift, ฯลฯ )

อันของรหัสข้างต้นส่วนใหญ่จะซ้ำกันของAddMvc()วิธีการ อย่างไรก็ตามเรากำลังดำเนินการบริการ "เริ่มต้น" แต่ละรายการด้วยตัวเราเองโดยกำหนดบริการแต่ละรายการแทนการไปกับเทมเพลตที่จัดส่งล่วงหน้าไว้ล่วงหน้า ฉันได้เพิ่มลิงก์ที่เก็บในบล็อคโค้ดหรือคุณสามารถเช็คเอาท์AddMvc() จากที่เก็บ GitHub .

โปรดทราบว่ามีคำแนะนำบางอย่างที่จะพยายามแก้ปัญหานี้โดย "เลิกทำ" ค่าเริ่มต้นแทนที่จะไม่นำมาใช้ในตอนแรก ... หากคุณพิจารณาว่าตอนนี้เรากำลังทำงานกับ Open Source นี่เป็นงานซ้ำซ้อน รหัสไม่ดีและนิสัยเก่าตรงไปตรงมาที่จะหายไปในไม่ช้า


ขั้นตอนที่ 2: สร้างตัวควบคุม

ฉันจะแสดงให้คุณเห็นคำถามที่ตรงไปตรงมาเพียงเพื่อให้คุณเรียงลำดับคำถามของคุณ

public class FooController
{
    [HttpPost]
    public async Task<IActionResult> Create([FromBody] Object item)
    {
        if (item == null) return BadRequest();

        var newItem = new Object(); // create the object to return
        if (newItem != null) return Ok(newItem);

        else return NotFound();
    }
}

ขั้นตอนที่ 3: ตรวจสอบของคุณContent-TypeและAccept

คุณต้องตรวจสอบให้แน่ใจว่าได้ตั้งค่าส่วนหัวContent-TypeและAcceptส่วนหัวในคำขออย่างถูกต้อง ในกรณีของคุณ (JSON) application/jsonคุณจะต้องการที่จะตั้งขึ้นเพื่อเป็น

หากคุณต้องการ WebAPI ของคุณเพื่อตอบสนองเป็น JSON เป็นค่าเริ่มต้นโดยไม่คำนึงถึงสิ่งที่ส่วนหัวของคำขอจะระบุที่คุณสามารถทำได้ในสองวิธี

วิธีที่ 1 ดังที่แสดงในบทความที่ฉันแนะนำไว้ก่อนหน้านี้ ( การจัดรูปแบบข้อมูลการตอบสนอง ) คุณสามารถบังคับรูปแบบเฉพาะที่ระดับตัวควบคุม / การดำเนินการ ฉันเองไม่ชอบวิธีการนี้ ... แต่ที่นี่มีไว้สำหรับความสมบูรณ์:

การบังคับใช้รูปแบบเฉพาะหากคุณต้องการ จำกัด รูปแบบการตอบกลับสำหรับการกระทำเฉพาะที่คุณสามารถทำได้คุณสามารถใช้ตัวกรอง [ผลิต] ตัวกรอง [ผลิต] ระบุรูปแบบการตอบกลับสำหรับการดำเนินการเฉพาะ (หรือตัวควบคุม) เช่นเดียวกับตัวกรองส่วนใหญ่สามารถใช้กับการกระทำตัวควบคุมหรือขอบเขตส่วนกลาง

[Produces("application/json")]
public class AuthorsController

[Produces]กรองจะบังคับให้การดำเนินการทั้งหมดภายใน AuthorsControllerที่จะกลับมาตอบสนองรูปแบบ JSON แม้ว่า formatters อื่น ๆ ที่ถูกกำหนดค่าสำหรับการประยุกต์ใช้และลูกค้าให้Acceptส่วนหัวขอที่แตกต่างกัน, รูปแบบที่มีอยู่

วิธีที่ 2 วิธีที่ ฉันชอบคือให้ WebAPI ตอบกลับคำขอทั้งหมดด้วยรูปแบบที่ร้องขอ อย่างไรก็ตามในกรณีที่มันไม่ยอมรับรูปแบบที่ร้องขอแล้วเลื่อนกลับไปที่ค่าเริ่มต้น (เช่น. JSON)

ก่อนอื่นคุณจะต้องลงทะเบียนในตัวเลือกของคุณ (เราจำเป็นต้องทำงานซ้ำพฤติกรรมเริ่มต้นตามที่ระบุไว้ก่อนหน้านี้)

options.RespectBrowserAcceptHeader = true; // false by default

ในที่สุดเพียงแค่สั่งรายการตัวจัดรูปแบบที่กำหนดไว้ในตัวสร้างบริการอีกครั้งเว็บโฮสต์จะใช้ค่าเริ่มต้นเป็นฟอร์แมตเตอร์ที่คุณวางไว้ที่ด้านบนของรายการ (เช่นตำแหน่ง 0)

ข้อมูลเพิ่มเติมสามารถพบได้ในรายการ. NET Web Development และ Tools Blog


ขอบคุณมากสำหรับความพยายามที่คุณใส่คำตอบของคุณเป็นแรงบันดาลใจให้ฉันนำไปใช้IActionResultกับreturn Ok(new {response = "123"});ไชโย!
Rossco

1
@Rossco ไม่มีปัญหา หวังว่าส่วนที่เหลือของรหัสจะช่วยแนะนำคุณเมื่อโครงการของคุณพัฒนา
Svek

1
ในการขยายหัวข้อนี้ฉันได้สร้างคำแนะนำเพิ่มเติมและเพิ่มเติมเกี่ยวกับการปรับใช้ WebAPI ที่นี่: stackoverflow.com/q/42365275/3645638
Svek

ในการตั้งค่า: RespectBrowserAcceptHeader = true; คุณไม่ได้อธิบายว่าทำไมคุณถึงทำเช่นนั้นและโดยทั่วไปแล้วไม่จำเป็นและผิดที่จะทำเช่นนั้น เบราว์เซอร์ขอ html และด้วยเหตุนี้พวกเขาจึงไม่ควรส่งผลกระทบต่อการเลือกฟอร์แมตเตอร์ (โครเมียมนั้นน่าเสียดายที่ต้องขอ XML) ในระยะสั้นมันเป็นสิ่งที่ฉันจะออกและทางเลือกที่คุณระบุอยู่แล้วพฤติกรรมเริ่มต้น
Yishai Galatzer

@YishaiGalatzer หัวข้อหลักของคำตอบของฉันคือการเน้นวิธีการถอนการติดตั้งมิดเดิลแวร์เริ่มต้นระหว่างไคลเอนต์และตรรกะของ API ในความคิดของฉันRespectBrowserAcceptHeaderเป็นสิ่งสำคัญเมื่อใช้การใช้ serializer ทดแทนหรือมากกว่าปกติเมื่อคุณต้องการตรวจสอบให้แน่ใจว่าลูกค้าของคุณไม่ได้ส่งคำขอผิดรูปแบบ ดังนั้นฉันเน้นว่า "หากโครงการของคุณต้องการการควบคุมเต็มรูปแบบและคุณต้องการกำหนดบริการของคุณอย่างเคร่งครัด"และจดบันทึกข้อความอ้างอิงที่ไฮไลต์ไว้ด้านบนข้อความนั้นด้วย
Svek

57

คุณมีวิธีที่กำหนดไว้ล่วงหน้าสำหรับรหัสสถานะทั่วไป

  • Ok(result)ส่งคืน200พร้อมการตอบกลับ
  • CreatedAtRouteส่งคืน201+ URL ทรัพยากรใหม่
  • NotFound ผลตอบแทน 404
  • BadRequestผลตอบแทน400ฯลฯ

ดูBaseController.csและดูController.csรายการวิธีการทั้งหมด

แต่ถ้าคุณยืนยันจริง ๆ คุณสามารถใช้StatusCodeเพื่อกำหนดรหัสที่กำหนดเองได้ แต่คุณไม่ควรทำอย่างนั้นเพราะจะทำให้โค้ดอ่านง่ายขึ้นและคุณจะต้องทำซ้ำรหัสเพื่อตั้งค่าส่วนหัว (เช่นเดียวกับCreatedAtRoute)

public ActionResult IsAuthenticated()
{
    return StatusCode(200, "123");
}

1
สิ่งนี้ทำให้ฉันเข้าใจคำตอบของฉันด้านล่าง ขอบคุณ
Oge Nwike

รหัสนี้ไม่ถูกต้องสำหรับ ASP.NET Core 2.2 ฉันเพิ่งได้ลองมันและมัน serializes เข้าสร้างขึ้นโดยวิธีการ ไม่รวมสตริง "123" โดยตรง JSONActionResultJson()
amedina

1
@amedina: ไม่ดีของฉันเพียงแค่ลบออกJson(...)และส่งผ่านสตริงไปยัง StatusCode
เซิง

เมื่อคุณพูดว่า "Ok (ผลลัพธ์)" - ผลลัพธ์คืออะไร เป็นสตริงรูปแบบ JSON หรือเป็นวัตถุ C # (ที่ได้รับการแปลงเป็นสตริง JSON โดยอัตโนมัติหรือไม่)
ตัวแปร

@ แปรปรวน: เป็น POCO / class / object เสมอ หากคุณต้องการส่งคืนสตริงคุณต้องใช้ "เนื้อหา" แทน
Tseng

43

ด้วยASP.NET Core 2.0วิธีที่เหมาะที่สุดในการคืนค่าออบเจกต์Web API(ซึ่งรวมกับ MVC และใช้คลาสพื้นฐานเดียวกันController) คือ

public IActionResult Get()
{
    return new OkObjectResult(new Item { Id = 123, Name = "Hero" });
}

สังเกตว่า

  1. มันกลับมาพร้อมกับ200 OKรหัสสถานะ (เป็นOkประเภทObjectResult )
  2. มันจะเจรจาต่อรองเนื้อหานั่นคือมันจะกลับมาขึ้นอยู่กับAcceptส่วนหัวในการร้องขอ หากถูกส่งในการร้องขอก็จะกลับมาเป็นAccept: application/xml XMLหากไม่มีการส่งอะไรJSONเป็นค่าเริ่มต้น

หากจำเป็นต้องส่งพร้อมรหัสสถานะให้ใช้ObjectResultหรือStatusCodeแทน ทั้งสองทำสิ่งเดียวกันและสนับสนุนการเจรจาต่อรองเนื้อหา

return new ObjectResult(new Item { Id = 123, Name = "Hero" }) { StatusCode = 200 };
return StatusCode( 200, new Item { Id = 123, Name = "Hero" });

หรือละเอียดยิ่งขึ้นด้วย ObjectResult:

 Microsoft.AspNetCore.Mvc.Formatters.MediaTypeCollection myContentTypes = new Microsoft.AspNetCore.Mvc.Formatters.MediaTypeCollection { System.Net.Mime.MediaTypeNames.Application.Json };
 String hardCodedJson = "{\"Id\":\"123\",\"DateOfRegistration\":\"2012-10-21T00:00:00+05:30\",\"Status\":0}";
 return new ObjectResult(hardCodedJson) { StatusCode = 200, ContentTypes = myContentTypes };

หากคุณต้องการกลับมาเป็น JSONโดยเฉพาะมีหลายวิธี

//GET http://example.com/api/test/asjson
[HttpGet("AsJson")]
public JsonResult GetAsJson()
{
    return Json(new Item { Id = 123, Name = "Hero" });
}

//GET http://example.com/api/test/withproduces
[HttpGet("WithProduces")]
[Produces("application/json")]
public Item GetWithProduces()
{
    return new Item { Id = 123, Name = "Hero" };
}

สังเกตว่า

  1. ทั้งสองบังคับใช้JSONในสองวิธีที่ต่างกัน
  2. ทั้งสองไม่สนใจการเจรจาต่อรองเนื้อหา
  3. วิธีแรกบังคับใช้ JSON กับ Json(object)serializer
  4. วิธีที่สองทำเช่นเดียวกันโดยใช้Produces()attribute (ซึ่งเป็น a ResultFilter) ด้วยcontentType = application/json

อ่านเพิ่มเติมเกี่ยวกับพวกเขาในเอกสารอย่างเป็นทางการ เรียนรู้เกี่ยวกับฟิลเตอร์ที่นี่

คลาสโมเดลแบบง่ายที่ใช้ในตัวอย่าง

public class Item
{
    public int Id { get; set; }
    public string Name { get; set; }
}

10
นี่เป็นคำตอบที่ดีเพราะจะเน้นไปที่คำถามและอธิบายการปฏิบัติจริงโดยย่อ
netfed

33

วิธีที่ง่ายที่สุดที่ฉันคิดคือ:

var result = new Item { Id = 123, Name = "Hero" };

return new JsonResult(result)
{
    StatusCode = StatusCodes.Status201Created // Status code here 
};

2
ฉันคิดว่านี่เป็นคำตอบที่ดีกว่าจาก @tseng เพราะวิธีการแก้ปัญหาของเขารวมถึงฟิลด์ที่ซ้ำซ้อนสำหรับรหัสสถานะและอื่น ๆ
Christian Sauer

2
การปรับปรุงอย่างหนึ่งที่คุณสามารถทำได้คือใช้ StatusCodes ที่กำหนดไว้ใน Microsoft.AspNetCore.Http ดังนี้: ส่งคืน JsonResult ใหม่ (ใหม่ {}) {StatusCode = StatusCode.Status404NotFound};
Bryan Bedard

2
นี่ควรเป็นคำตอบที่ยอมรับได้ แม้ว่าจะมีวิธีในการตั้งค่า json ในระดับสากล แต่บางครั้งเราต้องทำงานกับจุดสิ้นสุดแบบดั้งเดิมและการตั้งค่าอาจแตกต่างกัน จนกว่าเราจะหยุดสนับสนุนจุดรับมรดกบางอย่างนี่เป็นวิธีที่ดีที่สุดในการควบคุมอย่างเต็มรูปแบบ
4253

Microsoft.AspNetCore.Mvc.JsonResult เป็นชื่อเต็มที่ฉันคิดว่า ไม่มีคำตอบ FQN หรือ "ใช้" ทำให้ฉันรู้สึกแย่ :) แอสเซมบลี Microsoft.AspNetCore.Mvc.Core เวอร์ชัน = 3.1.0.0 วัฒนธรรม = เป็นกลาง PublicKeyToken = adb9793829ddae60 // C: \ Program Files \ dotnet \ packs \ Microsoft.AspNetCore.App.Ref \ 3.1.0 netcoreapp3.1 \ Microsoft.AspNetCore.Mvc.Core.dll
granadaCoder

1
สิ่งนี้ใช้งานได้สำหรับฉันเมื่อฉันมีประเภทที่แข็งแกร่ง ("ITem result = new Item" ในตัวอย่างนี้ ... รายการเป็นประเภทที่รู้จักกันตอนรันไทม์) ดูคำตอบของฉัน (สำหรับคำถามนี้) เมื่อประเภทไม่เป็นที่รู้จัก (ฉันมี json ใน db .. และชนิด json ไม่เป็นที่รู้จักในขณะทำงาน) ขอบคุณเจอรัลด์
granadaCoder

15

นี่คือทางออกที่ง่ายที่สุดของฉัน:

public IActionResult InfoTag()
{
    return Ok(new {name = "Fabio", age = 42, gender = "M"});
}

หรือ

public IActionResult InfoTag()
{
    return Json(new {name = "Fabio", age = 42, gender = "M"});
}

4

แทนที่จะใช้รหัสสถานะ 404/201 โดยใช้ enum

     public async Task<IActionResult> Login(string email, string password)
    {
        if (string.IsNullOrWhiteSpace(email) || string.IsNullOrWhiteSpace(password))
        { 
            return StatusCode((int)HttpStatusCode.BadRequest, Json("email or password is null")); 
        }

        var user = await _userManager.FindByEmailAsync(email);
        if (user == null)
        {
            return StatusCode((int)HttpStatusCode.BadRequest, Json("Invalid Login and/or password"));

        }
        var passwordSignInResult = await _signInManager.PasswordSignInAsync(user, password, isPersistent: true, lockoutOnFailure: false);
        if (!passwordSignInResult.Succeeded)
        {
            return StatusCode((int)HttpStatusCode.BadRequest, Json("Invalid Login and/or password"));
        }
        return StatusCode((int)HttpStatusCode.OK, Json("Sucess !!!"));
    }

Enum เป็นความคิดที่ยอดเยี่ยม!
Bhimbim

2

คำตอบที่ยอดเยี่ยมฉันพบที่นี่และฉันก็ลองดูคำสั่งคืนนี้StatusCode(whatever code you wish)และมันใช้งานได้ !!!

return Ok(new {
                    Token = new JwtSecurityTokenHandler().WriteToken(token),
                    Expiration = token.ValidTo,
                    username = user.FullName,
                    StatusCode = StatusCode(200)
                });

1
แบบนี้! คำแนะนำที่ดี!
ticky

0

โปรดอ้างอิงรหัสด้านล่าง, คุณสามารถจัดการรหัสสถานะหลาย ๆ ประเภท JSON ที่แตกต่างกัน

public async Task<HttpResponseMessage> GetAsync()
{
    try
    {
        using (var entities = new DbEntities())
        {
            var resourceModelList = entities.Resources.Select(r=> new ResourceModel{Build Your Resource Model}).ToList();

            if (resourceModelList.Count == 0)
            {
                return this.Request.CreateResponse<string>(HttpStatusCode.NotFound, "No resources found.");
            }

            return this.Request.CreateResponse<List<ResourceModel>>(HttpStatusCode.OK, resourceModelList, "application/json");
        }
    }
    catch (Exception ex)
    {
        return this.Request.CreateResponse<string>(HttpStatusCode.InternalServerError, "Something went wrong.");
    }
}

9
ไม่นี่มันแย่
Phillip Copley

0

สิ่งที่ฉันทำในแอปพลิเคชัน Asp Net Core Api ของฉันคือการสร้างคลาสที่ขยายจาก ObjectResult และให้ตัวสร้างจำนวนมากเพื่อปรับแต่งเนื้อหาและรหัสสถานะ จากนั้นแอ็คชั่นคอนโทรลเลอร์ทั้งหมดของฉันจะใช้หนึ่งในโครงสร้างต้นทุนที่เหมาะสม คุณสามารถดูการใช้งานของฉันได้ที่: https://github.com/melardev/AspNetCoreApiPaginatedCrud

และ

https://github.com/melardev/ApiAspCoreEcommerce

นี่เป็นลักษณะของคลาส (ไปที่ repo ของฉันสำหรับรหัสเต็ม):

public class StatusCodeAndDtoWrapper : ObjectResult
{



    public StatusCodeAndDtoWrapper(AppResponse dto, int statusCode = 200) : base(dto)
    {
        StatusCode = statusCode;
    }

    private StatusCodeAndDtoWrapper(AppResponse dto, int statusCode, string message) : base(dto)
    {
        StatusCode = statusCode;
        if (dto.FullMessages == null)
            dto.FullMessages = new List<string>(1);
        dto.FullMessages.Add(message);
    }

    private StatusCodeAndDtoWrapper(AppResponse dto, int statusCode, ICollection<string> messages) : base(dto)
    {
        StatusCode = statusCode;
        dto.FullMessages = messages;
    }
}

สังเกตว่าฐาน (dto) คุณแทนที่ dto ด้วยวัตถุของคุณและคุณควรจะไป


0

ฉันได้รับสิ่งนี้เพื่อทำงาน ปัญหาใหญ่ของฉันคือ json ของฉันเป็นสตริง (ในฐานข้อมูลของฉัน ... และไม่ใช่ประเภทที่รู้จัก / เฉพาะ)

ตกลงฉันได้รับการทำงานนี้ในที่สุด

////[Route("api/[controller]")]
////[ApiController]
////public class MyController: Microsoft.AspNetCore.Mvc.ControllerBase
////{
                    //// public IActionResult MyMethod(string myParam) {

                    string hardCodedJson = "{}";
                    int hardCodedStatusCode = 200;

                    Newtonsoft.Json.Linq.JObject job = Newtonsoft.Json.Linq.JObject.Parse(hardCodedJson);
                    /* "this" comes from your class being a subclass of Microsoft.AspNetCore.Mvc.ControllerBase */
                    Microsoft.AspNetCore.Mvc.ContentResult contRes = this.Content(job.ToString());
                    contRes.StatusCode = hardCodedStatusCode;

                    return contRes;

                    //// } ////end MyMethod
              //// } ////end class

ฉันเกิดขึ้นกับ asp.net core 3.1

#region Assembly Microsoft.AspNetCore.Mvc.Core, Version=3.1.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
//C:\Program Files\dotnet\packs\Microsoft.AspNetCore.App.Ref\3.1.0\ref\netcoreapp3.1\Microsoft.AspNetCore.Mvc.Core.dll

ฉันได้รับคำใบ้จากที่นี่ :: https://www.jianshu.com/p/7b3e92c42b61

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.