后台代理无法使用 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,但它包含在清单中)

Windows phone 8.1 后台任务突然退出

后台代理 ParseUser.CurrentUser 未缓存/不可访问 Windows Phone

无法使用 Windows Phone 后台任务进行异步调用

Windows Phone 8 模拟器无法连接到互联网