我正在使用第三方开发的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能够正常运行?
答案 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();
}