Windows Phone 8(与web api连接)问题

时间:2013-11-01 10:43:33

标签: c# windows-phone-7 windows-phone-8 asp.net-web-api

我在这里问一般问题。我真的不知道该怎么做。我开发了一个带有后端的Windows Phone 8移动应用程序作为Web服务,这是一个Web API服务。它有大约4到5个屏幕。

问题: 当我第一次加载我的应用程序并让所有内容加载(而不是中断从webapi操作获取时,通过应用程序栏转到第二个窗口或第三个窗口或第四个窗口并开始另一个获取记录)。它工作正常。

但如果我曾经让第一次加载运行并进行第二次获取记录。它造成了巨大的问题。 (延迟,返回null等)。任何想法如何在第一次提取运行时通过第二次提取来克服这个问题。这是一个普遍的问题吗?或者只是我有这个问题?

这是我正在使用的代码

 private static readonly HttpClient client;

    public static Uri ServerBaseUri
    {
        get { return new Uri("http://169.254.80.80:30134/api/"); }
    }

    static PhoneClient()
    {        
       client =new HttpClient();
       client.MaxResponseContentBufferSize = 256000;
       client.Timeout = TimeSpan.FromSeconds(100);
       client.DefaultRequestHeaders.Add("user-agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)");
    }      

    public async static Task<List<Categories>> GetDefaultCategories()
    {      
        HttpResponseMessage getresponse = await client.GetAsync(ServerBaseUri + "Categorys");                      
        string json = await getresponse.Content.ReadAsStringAsync();         
        json = json.Replace("<br>", Environment.NewLine);
        var categories = JsonConvert.DeserializeObject<List<Categories>>(json);
        return categories.ToList();
    }

1 个答案:

答案 0 :(得分:2)

弗拉基米尔在评论中指出了两个主要问题。您需要为每个请求创建一个新的HttpClient实例,我还建议您不要使用静态。

public class DataService
{
  public HttpClient CreateHttpClient()
  {
       var client = new HttpClient();
       client.MaxResponseContentBufferSize = 256000;
       client.Timeout = TimeSpan.FromSeconds(100);
       // I'm not sure why you're adding this, I wouldn't
       client.DefaultRequestHeaders.Add("user-agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)");
       return client;
  }

  public async Task<List<Categories>> GetDefaultCategories()
  {
        var client = CreateHttpClient();
        HttpResponseMessage getresponse = await client.GetAsync(ServerBaseUri + "Categorys");                      
        string json = await getresponse.Content.ReadAsStringAsync();         
        json = json.Replace("<br>", Environment.NewLine);
        var categories = JsonConvert.DeserializeObject<List<Categories>>(json);
        return categories.ToList();
  }
}

如果您绝对必须静态,我不会在技术上推荐此功能,但是,您可以通过应用类静态访问此服务的实例,以便轻松启动和运行。我更喜欢依赖注入技术。重要的是你限制静态实例。如果我的代码中有任何内容,我倾向于将它们从主App类中挂起。

public class App
{
  public static DataService DataService { get; set; }

  static App()
  {
    DataService = new DataService();
  }
  // other app.xaml.cs stuff
}

然后您可以调用代码中的任何位置:

var categories = await App.DataService.GetDefaultCategories();