【问题标题】:Can't I debug using my own device when connecting to local web service?连接到本地 Web 服务时,我不能使用自己的设备进行调试吗?
【发布时间】:2017-06-09 10:32:19
【问题描述】:

我在一个单独的解决方案中的 web api 项目中有一个 web 服务。我正在尝试从 Xamarin 项目访问该 Web 服务。我正在使用我的 Android 手机进行调试,但出现此错误。我遇到的所有访问 Web 服务的文章都使用了模拟器。是因为这个,我收到了这个错误还是我错过了什么?

更新 1:
我的代码如下,错误发生在第 10 行(包含using (WebResponse response = await request.GetResponseAsync()) 的行)。

private async Task<JsonValue> GetNamesAsync()
{
    try
    {
        string  url = "http://{network-ip-address}:{port}/api/Names";
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(url));
        request.ContentType = "application/json";
        request.Method = "GET";

        using (WebResponse response = await request.GetResponseAsync())
        {
                //Some code here
        }
        return null;
    }
    catch(Exception ex)
    {
        return null;
    }
}  

更新 2:
如果我Step Into (F11),然后单击大约 2 次后,将打开以下对话框。

【问题讨论】:

  • 这通常在尝试进入 Xamarin 函数时出现(例如base.OnCreate(savedInstanceState))。出现这种情况时应该运行哪一行?
  • 你可以试试Debug-&gt;windows-&gt;Exception Settings-&gt;tick Common Language Runtime and all it's children options.
  • @ElvisXia-MSFT 我照你说的做了。但仍然遇到同样的问题。我也更新了我的问题。如果可以,请你帮助我。谢谢。
  • @JonathanTwite 我也更新了我的问题。如果可以,请你帮助我。谢谢。
  • 不要像JonathanTwite所说的那样使用F11来尝试访问GetResponseAsync的源代码。

标签: android .net visual-studio-2015 xamarin.android iis-express


【解决方案1】:

你正试图进入代码:

WebResponse response = await request.GetResponseAsync()

也就是说,您正在尝试调试HttpWebRequest 类中的GetResponseAsync() 方法。这个类的源代码还没有加载到你的项目中(只有编译好的.dll),所以你不能进入这一行。

尝试F10 越过这条线。

您现在可能会遇到同样的错误 - 但是,这一次的原因会有所不同。由于等待GetResponseAsync() 方法,程序流程返回到调用GetNamesAsync() 的方法。如果该调用被等待,并且对该方法的调用链都等待返回Activity 方法(应该这样不阻塞UI),下一行要执行的代码将是某处的一行代码在您无法访问的 Xamarin/Android 源代码中。

例如

 1 class MyActivity : Activity
 2 {
 3     // This function is called by the Xamarin/Android systems and is not awaited.
 4     // As it is marked as async, any awaited calls within will pause this function,
 5     // and the application will continue with the function that called this function,
 6     // returning to this function when the awaited call finishes.
 7     // This means the UI is not blocked and is responsive to the user.
 8     public async void OnCreate()
 9     {
10         base.OnCreate();
11         await initialiseAsync(); // awaited - so will return to calling function
12                                  // while waiting for operation to complete.
13
14         // Code here will run after initialiseAsync() has finished.
15     }
16     public async Task initialiseAsync()
17     {
18         JsonValue names = await GetNamesAsync(); // awaited - so will return to Line 11
19                                              // while waiting for operation to complete.
20         
21         // Code here will run after GetNamesAsync() has finished.
22     }
23 }

【讨论】:

  • 嗨乔纳森,我也尝试过不使用异步方法(改为使用request.GetResponse())。但是我得到了同样的错误,如果我跳过,那么我得到一个异常"The request timed out"
  • 请求超时错误指向您的实际问题 - 请求不起作用。我假设这一行实际上在您的代码中填写了 ip 和端口:string url = "http://{network-ip-address}:{port}/api/Names";,这是一个 Get 调用,因此您应该能够将该 url 复制并粘贴到 Chrome 中,看看它是否有效。
  • 我可以访问 http://{network-ip-address}:{port} 但不能访问 http://{network-ip-address}: {port}/api/Names。我收到 HTTP 404 错误
  • 您的路由似乎不正确。检查 Web API 源代码,尤其是 Controller 方法上的 [Route("api/...")] 属性,或者如果未在此处设置,则在 App_Start\WebApiConfig 中设置默认路由配置。这可能区分大小写(我不记得了)。
  • 感谢您的帮助。终于让它工作了。我也错过了配置 IIS 以允许外部请求。
猜你喜欢
  • 2017-06-25
  • 1970-01-01
  • 2012-05-30
  • 1970-01-01
  • 2017-07-06
  • 2021-04-24
  • 1970-01-01
  • 1970-01-01
  • 2011-11-11
相关资源
最近更新 更多