如何修改MVC Get返回一个与XDocument.Load

时间:2016-06-28 18:10:08

标签: c# asp.net-mvc

我正在使用第三方开发的Windows 8 / 8.1应用程序,它依赖于Web服务来检索数据。我们有应用程序的源代码,但我们没有它用于Web服务,所以我需要重建它。更复杂的是,我无法对应用程序进行更改,因为它是在许多设备上进行了侧载。

即使我能够反编译Web服务的DLL,它也没有让我到达工作点。现在的障碍似乎是XDocument.Load无法处理返回的流。

这是AppCode:

    public async Task<CustomerModel> ReadDataFromXml(string address)
    {
        var client = new HttpClient();
        var response = await client.GetAsync(address);

        // check that response was successful or throw exception
        response.EnsureSuccessStatusCode();

        var streamResponse = await response.Content.ReadAsStreamAsync();
        var xDocumentObject = XDocument.Load(streamResponse);

        var contents = from contact in xDocumentObject.Descendants(Constants.CUSTOMER_TAG)
                       select new { 
                       ...

我正在使用VS 2013使用内置的MVC ASP.NET Web应用程序模板构建服务,该模板实现了ApiController。

旧代码在使用UTF8Encoding进行序列化后,通过

返回结果
HttpContext.Current.Response.Write(strMessage);

新代码

    public IEnumerable<Customer> Get(string activationcode)
    {
        return _handler.GetCustomerData(activationcode);
    }

我相信我需要通过当前返回IEnumerable的Get调用返回。

我相信我尝试为Get call

返回一个字符串

我尝试的另一件事是更改Get语句以返回字符串,然后返回文本的XML序列化版本。

private string Serialize(Customer cus)
    {
        try
        {
            XmlSerializer xmlSerializer = new XmlSerializer(typeof(Customer));
            XmlTextWriter xmlTextWriter = new XmlTextWriter((Stream)new MemoryStream(), Encoding.UTF8);
            xmlSerializer.Serialize((XmlWriter)xmlTextWriter, (object)cus);
            return this.UTF8ByteArrayToString(((MemoryStream)xmlTextWriter.BaseStream).ToArray());
        }
        catch (Exception ex)
        {
            return string.Empty;
        }
    }

但是返回“根级别的数据无效,第1行,第1位”

TLDR;有没有办法让GET语句返回结果,以便我们的Web应用程序中的XDocument.Load能够正常运行?

1 个答案:

答案 0 :(得分:0)

最后,弄明白了:

不是返回对象,而是更改Get函数以返回HttpReponseMessage。

public HttpResponseMessage Get(string activationcode)

将返回的数据序列化为您的对象

Customer customer = _handler.GetCustomerData(activationcode).First();
string serializedCustomer = Serialize(customer);

并使用StringContent来构建您的回报:

return new HttpResponseMessage
{
    Content = new StringContent(serializedCustomer, Encoding.UTF8, "text/xml")
};

这是用于序列化数据的函数。

private string Serialize(Customer cus)
{
    try
    {
        XmlSerializer xmlSerializer = new XmlSerializer(typeof(Customer));
        XmlTextWriter xmlTextWriter = new XmlTextWriter((Stream)new MemoryStream(), Encoding.UTF8);
        xmlSerializer.Serialize((XmlWriter)xmlTextWriter, (object)cus);
        return this.UTF8ByteArrayToString(((MemoryStream)xmlTextWriter.BaseStream).ToArray());
    }
    catch (Exception ex)
    {
        return string.Empty;
    }
}


private string UTF8ByteArrayToString(byte[] characters)
    { 
        return new UTF8Encoding().GetString(characters);
        //return characters.ToString(); 
    }