2016-06-28 3 views
0

Webサービスに依存してデータを取得するサードパーティ製のWindows 8/8.1アプリケーションを開発中です。私たちにはアプリケーションのソースコードがありますが、Webサービス用のソースコードはありませんので、再構築する必要があります。問題を複雑にするために、私はいくつかのデバイスにサイドロードされていたので、アプリケーションを変更することはできません。MVCを変更する方法XDocument.Loadで動作するオブジェクトを返すために取得

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 { 
         ... 

私はApiControllerを実装MVC ASP.NET Webアプリケーションで構築されたテンプレートを使用してサービスを構築するためにVS 2013を使用しています。

古いコードは、UTF8Encodingでそれをシリアル化した後、私は、これは現在のIEnumerableを返すGet呼び出しを通じて返さ必要があると考えている新しいコード

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

HttpContext.Current.Response.Write(strMessage); 

を経由して結果を返しました。

は、私は文字列を返すし、テキストのXMLserializedバージョンを返すために、Getステートメントを変更してみまし呼び出すゲット

もう一つの文字列を返す試みたと信じています。

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 StatementでWebアプリケーションのXDocument.Loadが正しく機能するように結果を返す方法はありますか?

+0

「HttpClient」から取得したデータをjsonに送信することはできますか? – csharpfolk

+0

これを確認してくださいので、答え:http://stackoverflow.com/questions/31115545/consuming-xml-using-httpclient-from-webapi – csharpfolk

+0

これはテキストとしてのリターンです。 "<?xml version = \" 1.0 \ "encoding = \" utf-8 \ "?> CNORRIS 2016-02-10T18:00:00 0001-/2001/XMLSchema \ "> 64 01-01T00:00:00 " –

答えて

0

は最後に、それを考え出した:

をする代わりに、オブジェクトを返すので、HttpReponseMessageを返すために、Get関数を変更します。

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(); 
    } 
関連する問題