WP7设备 + Windows 8.1 + VS 2012 + Asp.net Web Api - 如何让设备与Web Api进行通信?
WP7设备 + Windows 8.1 + VS 2012 + Asp.net Web Api - 如何让设备与Web Api进行通信?
我现在使用的是Windows 8.1和VS 2012。在我的Windows Phone应用程序中,我使用Web api后端来处理所有繁重的工作。然而,当我通过模拟器运行我的应用程序时,所有对我本地运行的web api的请求都被拒绝了。
我发现模拟器无法解析localhost。在这篇文章中,我做了一些非常模拟器的事情,然后就能够在Windows 8模拟器上运行没有问题。
然而,现在我需要在我的实际设备上进行测试以使用相机,但是我遇到了与模拟器相同的问题。我无法与我的本地web api进行通信。
当我尝试从设备(设备通过USB连接到计算机)向我的web api发送请求时,我会遇到这个错误:
Bad Request Bad Request - Invalid Hostname
HTTP Error 400. The request hostname is invalid.
我需要设置什么才能使其工作?
编辑
我仍然有这个问题。我已经能够使Windows Phone 8模拟器工作,但是仍然无法让我的WP7设备能够与本地的Web Api通信。
示例代码
我会做这样的事情
public class CourseService { public const string webApiUrl = "http://localhost:4372/api/values"; RestClient client = new RestClient(webApiUrl); public void GetCourses(Action successCallback, ActionerrorCallBack, bool forceError = false) { var request = new RestRequest(Method.GET); client.ExecuteAsync(request, response => { if (forceError) { errorCallBack("Failed"); } else { if (response.StatusCode == HttpStatusCode.OK) { successCallback(); } else { errorCallBack("Failed"); } } }); } } public class ValuesController : ApiController { // GET api/values public IEnumerable Get() { return new string[] { "value1", "value2" }; } }
- 我尝试了localhost(从我读到的内容中知道它不会起作用)
- 尝试了我的计算机IP地址
- 尝试在应用程序配置中添加IIS Express的IP地址
< bindings>
< binding protocol="http" bindingInformation=":55210:localhost" />
< binding protocol="http" bindingInformation=":55210:169.254.80.80" />
< /bindings>
问题出现的原因:
- 使用IIS Express运行WebApi,可能会遇到外部访问的问题。
- 使用IIS运行WebApi,可能会遇到跨域资源共享(CORS)的问题。
- 使用WebApi 1版本,对CORS的支持有限。
解决方法:
- 安装Microsoft.AspNet.WebApi.Cors NuGet包,以解决CORS问题。
- 参考CORS在WebApi2中的支持文档,了解更多关于CORS的知识。
- 提供调用WebApi和构造函数以及数据注释的代码,以便其他人能够更好地理解问题。
示例代码:
// 调用WebApi的示例代码 HttpClient client = new HttpClient(); client.BaseAddress = new Uri("http://localhost:port/"); client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); HttpResponseMessage response = await client.GetAsync("api/controller"); if (response.IsSuccessStatusCode) { var data = await response.Content.ReadAsAsync(); // 处理返回的数据 }
// WebApi构造函数和数据注释示例代码 public class MyApiController : ApiController { private readonly IDataService _dataService; public MyApiController(IDataService dataService) { _dataService = dataService; } ////// 获取数据 /// ///数据 public IHttpActionResult GetData() { var data = _dataService.GetData(); return Ok(data); } }
以上是解决WP7设备无法与WebApi通信的原因和解决方法。
问题出现的原因是在设备上调用本地主机是没有意义的,需要连接到远程机器,即您的PC名称或IP地址。
解决方法是使用Fiddler来监控Windows Phone 7上的网络请求。您可以在WP7上设置Fiddler,以更好地了解发生了什么。
以下是配置Fiddler和Windows Phone的步骤:
1. 下载并安装Fiddler(可以从这里下载)。
2. 在Windows Phone上打开Internet Explorer并输入“about:config”。
3. 在“IsolatedStorage”下,找到“ProxyOverride”或“ProxyBypass”键。
4. 将其设置为您PC的IP地址或主机名。
5. 在Fiddler中,启用“Tools”菜单下的“Gateway”选项。
6. 在Windows Phone上打开应用或浏览器,并尝试访问Web API。
通过这些步骤,您可以配置Fiddler来监控Windows Phone 7与Web API之间的通信,以便更好地理解问题所在。