2015-10-06 170 views
1

我试图返回从服务器端的一个字符串数组,并从客户端side.this找回它是我的服务器端的样子:如何从流中获取字符串数组值?

[HttpGet] 
public string[] GetFileNameList() 
{ 
    //get file names from the Directory 
    string[] files = Directory.GetFiles(@"C:\Users\ndmendis\Desktop\files\in", "*.txt"); 
    return files; 
} 

这是怎么了我的客户端的外观像:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:59831/Home/GetFileNameList/"); 
    request.ContentType = "application/text"; 
    request.Proxy = null; 
    request.KeepAlive = false; 
    //request.ContentLength = 0; 
    request.Method = "GET"; 

    var response = request.GetResponse(); 
    // Get the stream containing content returned by the server. 
    Stream dataStream = response.GetResponseStream(); 
    // Open the stream using a StreamReader for easy access. 
    StreamReader reader = new StreamReader(dataStream, Encoding.UTF8); 
    // Read the content. 
    string responseFromServer = reader.ReadToEnd(); 
    String[] str = responseFromServer.Cast<string>().Cast<string>().ToArray(); 

从客户端,我试图通过HTTP访问服务器,它的工作原理。它到我的服务器端。服务器端完美地返回字符串数组。 但问题是我没有得到该字符串数组的适当的内容(我“responseFromServer”变量的值是字符串[])。 'responseFromServer'变量应该包含我传递的值。有人可以解决我遇到的问题吗?谢谢!

显然,在响应变量有一个叫做段标记。所有(我是从服务器发送的值)的值都在里面,但它似乎我流不包含这些值...
enter image description here

+0

你在'responseFromServer'上得到了什么? –

+0

我得到的响应作为流,我将它转换为字符串使用streamreader ... – Dayan

+1

@Dayan我想,他在运行时询问有关此字符串的内容。 –

回答

3

广东话评论(没有足够的声望)。 但尝试以下阅读整个反应流作为一个字节数组,然后deseriaze它(使用.NET序列化类)转换成一个字符串数组(对象)。

编辑: 我建立了这个示例中的默认的WebAPI值控制器,其顺便也返回字符串的数组。


所有的
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Runtime.Serialization; 
using System.IO; 
using System.Net; 
using Newtonsoft.Json; 

namespace ConsoleApplication1 
{ 
    class Program 
{ 
    static void Main(string[] args) 
    { 
     using (var client = new WebClient()) 
     { 
      var url = "http://localhost:14596/api/values"; 
      client.Headers[HttpRequestHeader.ContentType] = "application/json"; 
      client.Headers[HttpRequestHeader.Accept] = "application/json"; 
      byte[] result = client.DownloadData(url); 
      // now use a JSON parser to parse the resulting string back to some CLR object 
      string[] resultArr = parse(result); 

     } 
    } 

    public static string[] parse(byte[] json) 
    { 
     string jsonStr = Encoding.UTF8.GetString(json); 
      return JsonConvert.DeserializeObject<string[]>(jsonStr); 
     } 

    } 
} 
+0

我真的不知道该怎么做...你能给我一个例子 – Dayan

1

首先,好像你正在使用ASP.NET的WebAPI发送响应。从你发布的代码看来,web api工作正常。

的问题是最有可能在Content-Type。在HTTP协议

信息总是使用二进制信息发送。由于二进制信息可以以许多不同的方式被解释,该标准提供了一种用于Content-Type头部使得连接客户机可以知道格式是在服务器中发送的数据。

在ASP.NET的WebAPI的特定情况下,所述默认配置是使用XML。所以,当你的API方法返回一个字符串,将的WebAPI默默地收拾它作为一个XML文件,并发送代替。如果您已经配置了另一个MediaTypeFormatter,那就是您将收到的格式。

所以,当你得到你的结果是该格式。有可能到格式转换为字符串(你如果是XML绝对可以做到),而是试图用它Cast<string>永远不会把它变成一个字符串数组。它会将它变成一串字符串表示的字符串(这是我对你所看到的内容的猜测)。

如果你想读XML并将其反序列化为的strings[]数组,你将需要类似的代码这一个:

using (var stringReader = new StringReader(responseFromServer)) 
{ 
    using (XmlReader reader = new XmlTextReader(stringReader)) 
    { 
     var serializer = new XmlSerializer(typeof(string[])); 
     str = serializer.Deserialize(reader) as string[]; 
    } 
} 

编辑:您设置的请求内容型应用的事实/ text与API将发送给您的内容无关。请求中的content-type指示的是客户端在对服务器的请求中使用的格式。

如果你要表明你想的格式你的答案是,看看在Accept头,但要留意的是要求一个application/text将在默认的WebAPI的配置无法正常工作(进而它不会当你试图反序列化它时有很多意义)。

+0

这给了我一个错误,说“XML文档(1,1)有错误”... – Dayan

+0

@dayan你可以在你的问题中发布responseFromServer字符串的内容吗? –

+0

这是什么在我的responseFromServer变量'System.String []'...'没有别的 – Dayan

1

假设您不知道您的服务器端有多少行,您无法事先创建正确大小的string[]

var list = new List<string>(); 

你的循环更改为:

using (var sr = new StreamReader(dataStream, Encoding.UTF8)) 
{ 
    string line; 
    while ((line = sr.ReadLine()) != null) 
    { 
     list.Add(line); 
    } 
} 

然后向你的列表的字符串数组:

string[] result = list.ToArray(); 

相反,你可以用字符串的集合开始

+0

显然我的Stream是空的,因此列表值是空的......我编辑了我的问题与截图......它解释了为什么流为null,但响应变量包含值) – Dayan