后台代理无法使用 Windows Phone 8 不支持的 API
Posted
技术标签:
【中文标题】后台代理无法使用 Windows Phone 8 不支持的 API【英文标题】:Windows Phone 8 Unsupported API cannot be used by a background agent 【发布时间】:2014-01-22 12:20:02 【问题描述】:我已经构建了一个 Windows Phone 8 应用程序,它可以毫无问题地编译和运行。但是,当我运行内置的 VS Store 测试工具包时,它会根据 XAP 包要求返回很多错误,格式如下:
[错误]:后台代理无法使用不受支持的 API。 程序集 Microsoft.Phone.Controls.Toolkit.dll 试图使用 Microsoft.Phone.Shell.ApplicationBarIconButton。
我的项目 dll ([projectname].dll) 和 Toolkit dll 出现错误。它似乎带回了所有内容,甚至包括我没有使用的引用(例如 add_OrientationChanged)。
现在我查看了 Microsoft 列出的 Unsupported APIs,但我没有使用其中的任何一个。页面底部是“值得注意的 API”列表,我正在使用其中一个是 HTTPWebRequest 来连接到 Web 服务。我假设这就是问题所在,因为我在整个应用程序中都使用它。
这是我使用 HTTPWebRequest 所做的示例:
Public Sub LoadRequest()
Dim request As HttpWebRequest = CType(WebRequest.Create(_ServiceURL), HttpWebRequest)
request.ContentType = "text/xml;charset=utf-8"
request.Method = "POST"
request.Headers("SOAPAction") = "<web service address>"
Start the asynchronous operation.
Dim result As IAsyncResult = _
CType(request.BeginGetRequestStream(AddressOf GetRequestsStreamCallback, request), _
IAsyncResult)
End Sub
Public Sub GetRequestsStreamCallback(ByVal asyncResult As IAsyncResult)
Dim request As HttpWebRequest = CType(asyncResult.AsyncState, HttpWebRequest)
Dim soapBody As System.Xml.Linq.XDocument = System.Xml.Linq.XDocument.Parse( _
"<soap:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' " & _
"xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'><soap:Header><[SOAP Header Here]></soap:Header>" & _
"<soap:Body><[SOAP Body Here]></soap:Body></soap:Envelope>")
'End the operation
Dim postStream As Stream = request.EndGetRequestStream(asyncResult)
'Convert the string into byte array.
Dim byteArray As Byte() = Encoding.UTF8.GetBytes(soapBody.ToString())
'Write to the stream.
postStream.Write(byteArray, 0, soapBody.ToString().Length)
postStream.Close()
Dispatcher.BeginInvoke(Sub()
Dim result As IAsyncResult = _
CType(request.BeginGetResponse(AddressOf GetRequestsResponseCallback, request), IAsyncResult)
End Sub)
End Sub
Public Sub GetRequestsResponseCallback(ByVal Result As IAsyncResult)
'Get the response
Dim request As HttpWebRequest = CType(Result.AsyncState, HttpWebRequest)
Dim response As HttpWebResponse = CType(request.EndGetResponse(Result), HttpWebResponse)
Dim streamResponse As Stream = response.GetResponseStream()
Dim streamRead As New StreamReader(streamResponse)
Dim responseString As String = streamRead.ReadToEnd()
streamResponse.Close()
streamRead.Close()
'Take action on the response
Dim Xml As XDocument = XDocument.Parse(responseString)
Dim ns As XNamespace = "<Service Address>"
etc...
End Sub
然后,我继续为应用程序所需的数据提取 XML 响应。关于测试套件在这里不满意的任何想法?我假设由于它在这个阶段没有通过验证,它很可能会被商店拒绝。
提前感谢您的任何想法。
【问题讨论】:
您在后台代理中使用程序集Microsoft.Phone.Controls.Toolkit.dll
做什么?没有它,您的代码应该可以正常工作,因为您的后台代理中不必有任何控制程序集。
感谢您的回复。问题是我找错树了。我什至不知道我正在运行后台代理。正如我所想,它与 WebRequest 无关。答案如下。
【参考方案1】:
问题是我不知道的现有后台代理(我从另一个开发人员那里接管了项目)。 WMAppManifest.xml 文件中有一个引用,这显然是使用钱包的早期测试的一部分,不再需要它。删除此引用解决了问题。
<ExtendedTask Name="BackgroundTask">
<BackgroundServiceAgent Specifier="WalletAgent" Name="WalletAgent" Source="<ProjectName>" Type="<ProjectName>.WPWalletAgent" />
</ExtendedTask>
【讨论】:
以上是关于后台代理无法使用 Windows Phone 8 不支持的 API的主要内容,如果未能解决你的问题,请参考以下文章
Windows Phone 8.1 后台任务 - 无法调试且不会触发
无法在 Windows Phone 8.1 中使用后台任务(需要 ID_CAP_NETWORKING,但它包含在清单中)