Web API ส่งคืนเนื้อหา XML

เว็บ API :

 public int Post(MyModel m){
    return CreateTask(m);
 }

ค่าส่งคืน :

Id:"<int xmlns="http://schemas.microsoft.com/2003/10/Serialization/">1446</int>"

คำถามของฉัน: เหตุใด web API จึงส่งคืน Id ข้างต้น ฉันต้องการมันเป็น "1446" ฉันจะกำจัดส่วน xml นี้ได้อย่างไร


person Sampath    schedule 30.09.2014    source แหล่งที่มา
comment
คุณเคยเห็นสิ่งนี้หรือไม่: stackoverflow.com/questions/12590801/ สิ่งนี้อาจมีประโยชน์เช่นกัน: stackoverflow.com/questions/18390709/   -  person David Tansey    schedule 01.10.2014
comment
WebAPI จะตอบ (ปกติ) ส่งคืน xml หรือ JSON ไปยังไคลเอนต์ หากคุณต้องการคำตอบประเภทอื่นคุณต้องเขียนตัวจัดการที่ทำสิ่งนี้ แต่นั่นดูเหมือนจะซับซ้อนเกินไป ลูกค้าไม่สามารถยอมรับ JSON หรือ xml ได้ใช่ไหม และแปลงคำตอบเป็นจำนวนเต็ม?   -  person Håkan Fahlstedt    schedule 01.10.2014
comment
เพียงเพื่อชี้แจงคำถามของคุณ คุณได้รับ xml แต่ต้องการรับ Json หรือคุณแค่ต้องการสตริงธรรมดา?   -  person Matthijs Wessels    schedule 01.10.2014


คำตอบ (3)


โครงการ WebApi ได้รับการกำหนดค่าใน Global.asax ที่นั่นคุณจะพบคลาสชื่อ WebApiConfig ภายในชั้นเรียนนี้ คุณจะพบกับ "ตัวจัดรูปแบบสื่อ"; Media Formatters บอกว่า WebApi ของคุณสามารถซีเรียลไลซ์ / ดีซีเรียลไลซ์ JSON System.Net.Http.Formatting.JsonMediaTypeFormatter(), XML หรือรูปแบบอื่น ๆ ได้หรือไม่

public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
           //...

            System.Web.Http.GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
            config.Formatters.Insert(0, new System.Net.Http.Formatting.JsonMediaTypeFormatter());
            config.Formatters.Insert(0, new System.Net.Http.Formatting.FormUrlEncodedMediaTypeFormatter());


        }
    }

หากตัวจัดรูปแบบ JSON เป็นรายการแรกในรายการของคุณ มันจะเป็นตัวซีเรียลไลเซอร์/ดีซีเรียลไลเซอร์เริ่มต้นของคุณเพื่อเข้าถึงรูปแบบอื่น ๆ ประเภทเนื้อหาของคำขอควรระบุรูปแบบที่ต้องการอย่างชัดเจนหากได้รับการสนับสนุน รูปแบบนั้นจะส่งคืน และหากไม่รองรับ จะกลับมาในรูปแบบเริ่มต้น

ผลลัพธ์ของเอาต์พุตที่คุณเห็นคือความรับผิดชอบทั้งหมดของการดีซีเรียลไลซ์/ซีเรียลไลซ์ที่ตัวจัดรูปแบบสื่อที่เลือกใช้อยู่

person Dalorzo    schedule 30.09.2014
comment
เยี่ยมมาก ขอบคุณ วิธีแก้ปัญหาของคุณใช้งานได้ แต่ฉันอยากจะถามคำถามหนึ่งข้อ แม้ว่าจะไม่ได้ใช้ฟอร์แมตเตอร์ json ด้านบน แต่ก็ใช้งานได้เกือบทุกครั้ง ทำไมจึงมีพฤติกรรมแปลก ๆ เช่นนี้ - person Sampath; 01.10.2014
comment
สิ่งเดียวที่อยู่ในใจของฉันที่สามารถทำให้พฤติกรรมเปลี่ยนแปลงได้คือประเภทเนื้อหาของคำขอ - person Dalorzo; 01.10.2014
comment
อ๋อ เข้าใจแล้ว ขอบคุณมากสำหรับคำตอบที่ดีของคุณ :) - person Sampath; 01.10.2014
comment
ซึ่งจะทำให้เกิดปัญหาในภายหลังเมื่อมีนักพัฒนารายอื่นเข้ามาและคาดว่า WebAPI จะทำงานตามปกติ - person frenchie; 01.10.2014
comment
@frenchie คุณผิดโดยสิ้นเชิงเกี่ยวกับเรื่องนี้ ... ตามที่อธิบายไว้ในโพสต์ของฉัน ตัวจัดรูปแบบสื่อตัวแรกเป็นค่าเริ่มต้น ส่วนอีกอันจะทำงานตามประเภทเนื้อหา ความเข้าใจของคุณผิดก็ผิด - person Dalorzo; 01.10.2014
comment
คุณกำลังจัดการกับการแก้ไขหมายเลขเริ่มต้นใช่ไหม - person frenchie; 01.10.2014
comment
@frenchie อีกครั้ง คุณผิด... คุณอ่านโพสต์ของฉันหรือเปล่า? ไม่มีอะไรผิดปกติกับการเปลี่ยนลำดับของตัวจัดรูปแบบสื่อหรือลบสิ่งที่ไม่จำเป็นออก เป็นการดีกว่าที่จะหลีกเลี่ยงปัญหาเกี่ยวกับรูปแบบที่ไม่รองรับ - person Dalorzo; 01.10.2014
comment
อย่างไรก็ตาม ทั้งคำตอบของเราใช้งานได้และ OP จะเลือกตามสิ่งที่ดีที่สุดสำหรับเขา - person frenchie; 01.10.2014

หากคุณต้องการส่งคืนเพียง 1446 คุณต้องส่งคืน HttpResponseMessage เช่นนี้

public HttpResponseMessage Post(Event_model event)
{

HttpResponseMessage TheHTTPResponse = new HttpResponseMessage();
TheHTTPResponse.StatusCode = System.Net.HttpStatusCode.OK;
TheHTTPResponse.Content = new StringContent(Event.CreateEvent(event).ToString(), Encoding.UTF8, "text");

return TheHTTPResponse;

}

หากคุณเปลี่ยนการกำหนดค่าทั่วโลก อาจทำให้เกิดปัญหาเมื่อคุณใช้บริการเว็บที่ต้องส่งคืนรูปแบบอื่น ด้วยการส่งคืน HttpResponseMessage คุณสามารถกังวลเกี่ยวกับวิธีการเฉพาะที่คุณกำลังเผชิญอยู่

person frenchie    schedule 30.09.2014
comment
คุณผิดโดยสิ้นเชิงเกี่ยวกับเรื่องนี้... ตามที่อธิบายไว้ในโพสต์ของฉัน ตัวจัดรูปแบบสื่อตัวแรกเป็นค่าเริ่มต้น ส่วนอีกตัวจะทำงานตามประเภทเนื้อหา ความเข้าใจของคุณผิดก็ผิด - person Dalorzo; 01.10.2014

ในคำขอของคุณ ให้ตั้งค่าส่วนหัว Accept เป็น application/json:

Accept: application/json
person Fordio    schedule 30.09.2014
comment
เขาไม่ได้พูดถึงเรื่องนั้น ดูเหมือนว่าเขากำลังพยายามกำจัดส่วน xml ออก - person Fordio; 01.10.2014