【发布时间】: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