0

我在这里问一般性问题。我真的不知道在这里做什么。我开发了一个带有后端的 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();
    }
4

1 回答 1

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();
于 2013-11-02T19:32:45.010 回答