我的 Windows Phone 应用程序使用来自使用 Apache Tomcat 的远程服务的数据。到目前为止,对服务的每次调用都是使用http://协议进行的,但最近服务开发人员添加了一个安全层,现在我必须使用https://协议发出请求。
我知道 Windows Phone 的默认行为是避免每个自签名证书,最佳情况是拥有由证书颁发机构签名的证书,但我没有。在网上搜索我发现可以在WP设备上安装自签名证书,有两种选择:
- 发送邮件并附上.cer文件。当我们尝试打开它时,WP 开始安装过程。
- 将.cer文件放在服务器的公共空间中,可通过http://协议访问。在应用程序首次启动时,我们尝试使用设备浏览器打开其 URL,然后 WP 开始安装过程。
b 选项对用户来说不那么烦人,所以我就是这样做的。
我在我的 PC 上使用 Internet Explorer创建* .cer 文件。我不知道我这一步做得好不好。我知道可以使用 Mozilla Firefox 导出,但列表中没有.cer文件格式。
对服务的请求返回此错误:“远程服务器返回错误:NotFound。”</p>
这是我在未实施安全性时使用的方法:
public void Start()
{
String requestString = url + method + parameters;
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(requestString);
request.BeginGetResponse(FinishHttpWebRequest, request);
}
public void FinishHttpWebRequest(IAsyncResult result)
{
HttpWebRequest request = result.AsyncState as HttpWebRequest;
if (request != null)
{
try
{
WebResponse response = request.EndGetResponse(result);
Stream streamResponse = response.GetResponseStream();
string responseString = new StreamReader(streamResponse).ReadToEnd();
}
catch (WebException e)
{
…
}
}
}
对于开发,我通过邮件发送.cer文件并使用 Windows Phone Emulator 打开它,Windows Phone 告诉安装成功但仍然出现错误。
这些是我正在使用的选项:
选项 A. 与http协议完全相同的方法
private void Start(string url)
{
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
request.UseDefaultCredentials = true;
request.AllowAutoRedirect = true;
request.BeginGetResponse(FinishWebRequest, request);
}
public void FinishWebRequest(IAsyncResult result)
{
HttpWebRequest request = result.AsyncState as HttpWebRequest;
if (request != null)
{
try
{
WebResponse response = request.EndGetResponse(result);
Stream streamResponse = response.GetResponseStream();
string responseString = new StreamReader(streamResponse).ReadToEnd();
}
catch (WebException ex)
{
…
}
}
}
选项 B. 使用 Web 客户端
private WebClient myWebClient;
public void Start(string requestString)
{
myWebClient = new WebClient();
myWebClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(DownloadStringCompleted);
myWebClient.DownloadStringAsync(new System.Uri(requestString));
}
void DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
try
{
string Text = e.Result;
}
catch
{
...
}
}
选项 3 与httpwebrequest 的 msdn 页面底部的示例非常相似,也与选项 1 非常相似。
我错过了什么?认证安装是否正确?
如果您需要更多信息,请索取
感谢您的帮助。
编辑 2013/07/18 我添加了更多信息,我认为它是可用的。
我使用 Microsoft Internet Explorer导出到.CER文件的步骤(我的 Windows 安装不是英文的,所以我确信不是每个选项都与我写的完全一样),类似于:
- 打开https://myWebApp.com
- 加载窗口:“此网站的安全证书有问题”
- 点击“继续浏览本网站”
- 在顶部,我单击“查看证书”
- 在“详细信息”选项卡中执行“复制到文件”。
- 通过邮件发送生成的文件并在 Windows Phone 模拟器中打开它。
我不知道证书是否必须在之前导出它的根权限证书中,我不知道。
我得到的 WebException ex 具有以下数据:
信息:
"The remote server returned an error: NotFound."
地位:
UnknownError
堆栈跟踪:
at System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state)
at System.Net.Browser.ClientHttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
at MyApp.Model.Webservice.SecureRestClient.FinishWebRequest(IAsyncResult result)
at System.Net.Browser.ClientHttpWebRequest.<>c__DisplayClassa.<InvokeGetResponseCallback>b__8(Object state2)
at System.Threading.ThreadPool.WorkItem.WaitCallback_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadPool.WorkItem.doWork(Object o)
at System.Threading.Timer.ring()
编辑 2
在文档 Windows® Phone 7 和证书中说,建议重新启动设备以激活最近安装的证书。
我将证书发送到我的 HTC Radar 并且安装成功。但是,当我使用 Internet Explorer 打开https://myWebApp.com时,会加载窗口:“有问题……”所以我想我在导出.cer文件时遗漏了一些东西。
编辑 3
现在可以在设备上调试(解锁步骤),但情况没有改变。您需要更多信息吗?我错过了什么?我总是得到未找到的异常。
谢谢!