将XML发布到Web API并返回结果

时间:2014-10-31 09:57:07

标签: c# xml asp.net-web-api

所以我一直在努力让这项工作有一段时间了。 让我解释一下这个要求。 我必须编写一个WebAPI,它将接受XML,进行一些查找并返回响应。

我是新手,所以寻求一些帮助。建议是创建一个表示传入XML的自定义对象 并使用该对象作为WebAPI公开的方法的参数。 结果将是一个不成问题的课程。

以下是完成的步骤。

创建一个空的WebAPI项目。 添加了一个表示传入XML的类。

传入XML:

<InComingStudent>
<StudentID>10</StudentID>
<Batch>56</Batch>
</InComingStudent>

班级:

public class InComingStudent
{
    public string StudentID { get; set; }
    public string Batch { get; set; }
}

返回此类型的对象:

public class StudentResult
{
    public string StudentID { get; set; }
    public string Batch { get; set; }
    public string Score { get; set; }
}

使用此方法添加了Students控制器:

public class StudentsController : ApiController
{
    [HttpPost]
    public StudentResult StudentStatus(InComingStudent inComingStudent)
    {

        ProcessStudent po = new ProcessStudent();
        StudentResult studentResult = po.ProcessStudent();
        return StudentResult;
    }
}

跑完服务。它在404的新浏览器中打开。没关系,因为我没有起始页。

写了一个控制台应用程序来测试:

private static async void PostToStudentService()
{
    using (var client = new HttpClient())
    {
        var studentToPost = new InComingStudent() { StudentID = "847", Batch="56"};
        client.BaseAddress = new Uri("http://localhost:53247/");
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml"));

        HttpResponseMessage response = await client.PostAsXmlAsync("api/Students/StudentStatus", studentToPost);

        if (response.IsSuccessStatusCode)
        {
            // Print the response
        }
    }
}

MediaTypeWithQualityHeaderValue设置为application / xml。 到现在为止还挺好。 当服务运行并运行控制台应用程序时,响应为404&#34; Not Found&#34;。

我错过了什么?

非常感谢任何帮助。

问候。

1 个答案:

答案 0 :(得分:1)

您是否尝试过[FromBody]属性?

public class StudentsController : ApiController
{
    [HttpPost]
    public StudentResult StudentStatus([FromBody]InComingStudent inComingStudent)
    {
        ProcessStudent po = new ProcessStudent();
        StudentResult studentResult = po.ProcessStudent();
        return StudentResult;
    }
}

作为建议,我会使用属性路由。

public class StudentsController : ApiController
{
    [HttpPost, Route("api/stutents/studentsstatus")]
    public StudentResult StudentStatus([FromBody]InComingStudent inComingStudent)
    {
        // ...
   }
}