【问题标题】:MVVM Light making an HTTP Get request using WebapiMVVM Light 使用 Webapi 发出 HTTP Get 请求
【发布时间】:2015-11-07 07:45:48
【问题描述】:

我是 MVVM 和 Web 相关技术的新手。我们目前正在使用 Visual Studios 2013 中最新的 MVVMLight 框架开发 MVVM 客户端应用程序。该应用程序使用 Microsoft 的 Webapi(最新版本)通过 HTTP 请求将数据获取到我们的模型中。我们的代码执行到发出 HTTP 请求的位置,并且我们已经确认服务器正在获取请求,收集请求的数据并将其作为 JSON 返回。但是客户端永远不会看到响应,它只是继续等待响应。就好像我们看到了一个似乎与线程有关的问题。在一个线程上发出请求,但在另一个线程上收到响应。这是我们的代码(发出 HTTP 请求的地方):

公共类数据服务:IDataService {

    #region Fields

    private HttpClient _client;
    private LfActivityDataReturnObject _activityReturnObj;
    private AdroServices _adroServices;
    private bool _selectedProcssingOptionPosted = false;
    private bool _activityDataSuccessfullyRetrieved = false;
    private decimal _incomingLFEntryId;

    #endregion

    #region Constructor

    public DataService()
    {
        try
        {    
            //Get command line arguments
            string[] arguments = Environment.GetCommandLineArgs();

            for (int i = 1; i < arguments.Length; i++)
            {
                switch (i)
                {
                    case 1:
                        {
                            if (!Decimal.TryParse(arguments[i], out _incomingLFEntryId))
                            {
                                _incomingLFEntryId = -1;
                            }
                            break;
                        }
                }
            }

            if (_incomingLFEntryId <= 0)
            {
                throw new ArgumentException(String.Format("Invalid Activity Shortcut Entry ID: {0}", _incomingLFEntryId));
            }
        }
        catch (Exception e)
        {                
            throw e;
        }
    }

    #endregion



    #region Methods



    public void GetGeneralInformationModel(Action<GeneralInformationModel, Exception> callback)
    {
        Exception locException = null;
        GeneralInformationModel locGeneralInformationModel = null;

        if (_adroServices == null)
        {
            try
            {
                //Start the HTTP request
                GetActivityDataAsync().Wait();
            }
            catch (Exception e)
            {
                locException = e;
            }
            // change? should be for http success but adro failure
            if (_activityDataSuccessfullyRetrieved)
            {
                _adroServices = new AdroServices(_activityReturnObj);
                locGeneralInformationModel = new GeneralInformationModel(_adroServices);
            }
            else
            {
                Exception e2 = new Exception("Error retrieving activity data in DataService");
                locException = e2;
            }
        }
        else
        {
            locGeneralInformationModel = new GeneralInformationModel(_adroServices);
        }

        var item = locGeneralInformationModel;
        callback(item, locException);          
    }   

    //Get data from the repository via the service layer.
    private async Task GetActivityDataAsync()
    {
        try
        {
            using (this._client = new HttpClient())
            {
                _client.BaseAddress = new Uri("http://localhost:52512//");
                _client.DefaultRequestHeaders.Accept.Clear();
                _client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                //Line below is where the app just runs getting no response
                HttpResponseMessage caseDataResponse = await _client.GetAsync(string.Format("api/LfUrs/{0}", _incomingLFEntryId));

                if (caseDataResponse.IsSuccessStatusCode)
                {
                    _activityReturnObj = await caseDataResponse.Content.ReadAsAsync<LfActivityDataReturnObject>();

                    if (_activityReturnObj.ReturnCode == 0)
                    {                            
                        _activityDataSuccessfullyRetrieved = true;
                    }
                    else
                    {
                        _activityDataSuccessfullyRetrieved = false;
                    }
                }
                else
                {
                    _activityDataSuccessfullyRetrieved = false;
                }
            }
        }
        catch (Exception ex)
        {
            _activityDataSuccessfullyRetrieved = false;
            throw ex;
        }
    }

我们曾尝试使用 Fiddler 获取更多信息,但 Fiddler 似乎无法透露任何细节。另外我应该提到我们正在模拟本地主机上的服务器,如上所述,我们已经确认服务器收到请求并返回数据。我和我的同事开始认为这与 MVVM Light Framework 和 IOC 或可能与线程有关。当我们在不使用框架的 MVVM 解决方案中使用相同的代码时,它可以工作。任何帮助将不胜感激。谢谢...迈克

【问题讨论】:

  • 本地主机也在使用 IIS Express 来接收 HTTP 请求。

标签: c# wpf mvvm asp.net-web-api


【解决方案1】:

我想通了。不知何故,在我的 app.xaml 中,Dispatcher.Helper 已被移动到事件 On_Startup 而不是包含在类构造函数中。此外,我必须将 HTTP 内容移动到 ADRO 服务类中,并确保它是在 App.xaml 中的 App 构造函数中在 Dispatcher.Helper 之后构建的。但感谢所有参与 StackOverFlow 的人。这种资源绝对是救命稻草。谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    相关资源
    最近更新 更多