通过 XML、ASP.NET 和 AJAX 暴露 iTunes 资料库






4.26/5 (9投票s)
2006 年 10 月 24 日
7分钟阅读

82550

459
一篇关于通过 XML、ASP.NET 和 AJAX 暴露 iTunes 资料库的文章。
引言
最近,我阅读了 MSDN 上 Peter Bernhardt 关于公开个人 iTunes 音乐库在网络上的一篇文章。这篇文章引起了我的兴趣,并为我提供了一个小型“调查”项目的蓝图。当我说“调查”时,我的意思是希望有机会接触一些新技术。我一直认为那些“Hello World”示例永远不现实,因此让新技术调查变得乏味。因此,我一直在寻找小型项目,以便能够尝试新技术,同时还能有机会构建一些有趣且有用的东西。本文旨在描述这样一个项目,即创建一个小型且有趣(至少对自称的音乐爱好者而言)的网站,该网站在网络上公开我的 iTunes 库。请注意,我确实意识到 iTunes 有一些内置功能可以做到这一点,但这会抵消我“调查”的全部好处。
如果你和我一样,你可能拥有大量音乐,这些音乐根本无法放入你的 iPod。当你在工作时渴望某首歌曲,但它不在你的 iPod 上时,该怎么办?可以从你的个人资料库下载。在底部,你将找到该网站的完整源代码。
我希望使用的一些技术和技术,以及本文中将描述的技术和技术是
- Atlas,特别是
AutoCompleteExtender
。这是我的主要目标。开始调查 Atlas;我知道我可能已经晚了,但嘿,我至少在尝试这些东西。 - 数据集和从翻译的 XML 文件加载。对我来说这不算什么新鲜事,但尝试翻译 iTunes 音乐库文件仍然很有趣。
- ASP.NET Membership Controls and Providers。
在深入研究代码之前,我应该提几点。首先,这个网站是为了向我自己公开我的音乐库。显然,版权法在我脑海中,这就是我调查会员服务的原因。在这种情况下,会员就是我。接下来,我使用 Bill Evjen 的个人网站入门套件作为网站框架。我使用 SQL Server 2005 作为会员相关表的数据库。最后,我使用了这个名为ELMAH 的免费异常日志记录模块(非常好的工具!)。那么,让我们进入代码。
使用代码
ASP.NET 会员服务
要介绍的第一个主题是 ASP.NET 会员提供程序。我做的第一件事是运行 aspnet_regsql.exe 工具来创建处理我的网站会员资格所需的所有相关表和存储过程。完成后,我在 web.config 中定义了我想跟踪的与用户相关的字段。同样,我将我的站点指向 SQL Server 数据库,以便 Membership Controls 可以发挥其魔力。下面是我的 web.config 的快照。
<membership>
<providers>
<remove name="AspNetSqlMembershipProvider"/>
<add name="AspNetSqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider,
System.Web,
Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="LocalSqlServer"
enablePasswordRetrieval="true"
enablePasswordReset="true"
requiresQuestionAndAnswer="false"
applicationName="/" requiresUniqueEmail="false"
minRequiredPasswordLength="1"
minRequiredNonalphanumericCharacters="0"
passwordFormat="Clear" maxInvalidPasswordAttempts="5"
passwordAttemptWindow="10"
passwordStrengthRegularExpression=""/>
</providers>
</membership>
<profile>
<properties>
<add name="FullName"/>
<add name="email"/>
<add name="Street"/>
<add name="City"/>
<add name="State"/>
</properties>
</profile>
接下来,我创建了 Register.aspx 页面并将 CreateUserWizard
控件插入页面。此控件处理所有繁重的工作,将用户注册到 SQL Server 数据库。繁重的工作包括检查用户名是否已存在于数据库中、确保密码符合自定义策略、将记录插入 SQL Server 表等。该控件非常方便,以至于让我想起了我以前编写过的许多旧网站。接下来,我创建了 MyAccount.aspx 页面来跟踪与注册用户相关的其他配置文件信息。MyAccount.aspx 页面显示一个文本框控件,该控件显示用户存储的配置文件信息。这与上面的 web.config 中定义的信息相同。请注意下面的方法,该方法获取用户输入的数据并将其保存到数据库。
Sub btnUpdateAccount_Click(ByVal sender As Object, _
ByVal e As System.EventArgs)
Try
Profile.FullName = txtName.Text
Profile.Street = txtAddress.Text
Profile.City = txtCity.Text
Profile.State = txtState.Text
Profile.email = txtEmail.Text
Catch ex As Exception
End Try
End Sub
这些个人配置文件信息存储在 aspnet_Profile 表的 PropertyName 和 PropertyValue 列中。最后,我在 Default.aspx 和 Default.Master 页面中使用 LoginView
控件来处理根据用户是否登录而显示信息。这是通过 <anonymoustemplate>
和 <loggedintemplate>
部分实现的。此控件允许配置内容区域,这些区域根据用户是否登录而显示信息。这一切的魔力在于,我只需要编写 **很少** 代码就能拥有一个功能齐全的用户登录/配置文件模块。ASP.NET 2.0 结合会员服务提供了使这一切变得简单的所有基础结构。一旦这一切都完成,我得到了以下结果
登录、LoginView、CreateUserWizard 控件
使用 Profile 对象
数据集/XMLDataSources/XSLT
下一个要介绍的主题是,既然我们有了登录模块,就是获取 iTunes 音乐库以供显示。如果你还不知道,iTunes 将你音乐库的所有信息存储在一个 XML 文件中。目标是加载这个 XML 文件,以便我可以将我的音乐信息显示在 GridView
中进行搜索/排序/过滤等。第一步是创建一个名为 iTunesLibrary
的类,该类公开了一个名为 GetMusicFileAsXML
的方法。该方法关键之处在于它通过 XSLT 翻译 XML 文件,以便可以轻松地将其加载到 DataView
和 GridView
中。还有一点要提的是,我的 XML 音乐库的位置存储在 web.config 中以供快速参考。
Public Shared Function GetMusicFileAsXML() As XmlDocument
Dim myMusicFile As String
Dim myXMLDocument As New XmlDocument
Dim translatedMusicFile As New XmlDocument
Dim myMusicTranslator As String
Try
If _iTunesLibrary Is Nothing Then
myMusicFile = _
System.Configuration.ConfigurationManager.AppSettings(_
"MusicLibrary")
myMusicTranslator = _
System.Configuration.ConfigurationManager.AppSettings(_
"MusicTranslator")
myXMLDocument.Load(myMusicFile)
translatedMusicFile = _
BMR.Common.Framework.XMLTools.XSLTranslator.TransormXML(_
myXMLDocument, myMusicTranslator)
Return translatedMusicFile
Else
Return _iTunesLibrary
End If
Catch ex As Exception
Throw New GotDotNet.Elmah.ApplicationException(ex.ToString)
Finally
myMusicTranslator = Nothing
myXMLDocument = Nothing
End Try
Return Nothing
End Function
翻译 iTunes 音乐库所需的 XSL 如下
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0"
encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<iTunesLibrary
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xsl:apply-templates select="plist/dict/dict/dict"/>
</iTunesLibrary>
</xsl:template>
<xsl:template match="dict">
<track>
<xsl:apply-templates select="key"/>
</track>
</xsl:template>
<xsl:template match="key">
<xsl:attribute name="{translate(text(), ' ', '_')}">
<xsl:value-of select="following-sibling::node()[1]"/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
这会生成一个看起来像这样的 XML 文件
<iTunesLibrary xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <track Track_ID="64" Name="Like Humans Do (radio edit)" Artist="David Byrne" Album="Look Into The Eyeball" Genre="Rock" Kind="AAC audio file" Size="3454661" Total_Time="213623" Track_Number="1" Date_Modified="2006-10-14T16:35:04Z" Date_Added="2006-10-14T16:34:49Z" Bit_Rate="128" Sample_Rate="44100" Persistent_ID="5D99F4DC1D75F0B4" Track_Type="File" Location="file:///C:/Documents%20and%20Settings /Brian%20Rush/My%20Documents/My%20Music/iTunes/ iTunes%20Music/David%20Byrne/Look%20Into%20The%20Eyeball /01%20Like%20Humans%20Do%20(radio%20edit).m4a" File_Folder_Count="-1" Library_Folder_Count="-1" /> </iTunesLibrary>
最后,在 Default.aspx 页面中,我获取了翻译后的音乐库,并在 GridView
中显示结果。我通过调用以下方法来实现此目的
Protected Sub LoadMusicFile(ByVal sortColumn As String, _
ByVal sortDirection As String)
Dim myMusicFile As XmlDocument
Dim aDataSet As New DataSet()
Dim aFilterCriteria As String
Try
myMusicFile = Cache("myMusicLibrary")
Dim sReader As New StringReader(myMusicFile.OuterXml)
aDataSet.ReadXml(sReader)
Dim aDataView As New DataView(aDataSet.Tables(0))
Dim aControl As System.Web.UI.WebControls.GridView
aControl = Me.MyTuneView.FindControl("LibraryGrid")
aControl.DataSource = aDataView
aFilterCriteria = Me.getSearchFilterCriteria
If Len(aFilterCriteria) > 0 Then
aDataView.RowFilter = Me.getSearchFilterCriteria
End If
aDataView.Sort = sortColumn + " " + sortDirection
aControl.DataBind()
Catch ex As Exception
Throw New GotDotNet.Elmah.ApplicationException(ex.ToString)
Finally
aDataSet = Nothing
End Try
End Sub
ATLAS 和 AutoCompleteExtender
下一个要介绍的主题是,既然我们已经翻译并加载了 iTunes 音乐库到 GridView
中,那么如何启用库的搜索和排序。我所做的是公开几个文本框,我可以在其中输入搜索条件。我想使用的关键技术是根据我库中可用的乐队和歌曲自动完成文本框。一旦这些文本框被填满,我想根据这些条件过滤 GridView
。为了做到这一点,我使用了 <atlas:AutoCompleteExtender>
控件。此控件允许实现像 Google 中输入搜索字符串时看到的功能,即自动完成潜在的搜索值。此控件**非常**酷,而且**非常**容易使用。以下是我实现它的方法。
首先,我将 <atlas:AutoCompleteExtender>
控件导入到我的 Default.aspx 页面中,并配置该控件以定位每个相应的搜索文本框控件。
Band <asp:TextBox ID="txtSearchBand" runat="server" Width="170px">
</asp:TextBox>
<asp:Button ID="searchButton" runat="server" CssClass="button"
Text="Go" OnClick="searchLibrary" /><br /> <br />
<atlas:AutoCompleteExtender ID="AvailableBandsExtender" runat="server"
ServiceMethod="GetAvailableBands"
ServicePath="AutoCompleteServices.asmx"
MinimumPrefixLength="1">
<atlas:AutoCompleteProperties Enabled="true"
ServiceMethod="GetAvailableBands"
ServicePath="AutoCompleteServices.asmx"
TargetControlID="txtSearchBand"
MinimumPrefixLength="1" />
</atlas:AutoCompleteExtender>
有几个关键点需要强调;第一点是 ServiceMethod
属性。这是在用户在目标文本框中输入文本时调用的 Web 服务中方法的名称。在上面的示例中,目标控件是 txtSearchBand
文本框。一旦我输入一个字符,Atlas 框架就会处理触发 GetAvailableBands
方法并在 txtSearchBand
文本框下方以列表形式显示信息。
第二,我创建了一个名为 AutocompleteServices.vb 的 Web 服务,并在其中公开了一个公共方法 GetAvailableBands
。此方法负责将 iTunes XML 文件加载到 DataView
中,根据输入的文本值过滤 DataView
,然后返回一个匹配的乐队的 String
数组。这是 GetAvailableBands
方法的代码。
<WebMethod()> _
Public Function GetAvailableBands(ByVal prefixText _
As String, ByVal count As Integer) As String()
Dim aBandList As New _
System.Collections.Specialized.StringCollection
Dim myMusicFile As System.Xml.XmlDocument
Dim i As Integer
Dim ht As New System.Collections.Hashtable
Try
myMusicFile = iTunesLibrary.GetMusicFileAsXML()
Dim aDataSet As New System.Data.DataSet
Dim sReader As New _
System.IO.StringReader(myMusicFile.OuterXml)
aDataSet.ReadXml(sReader)
Dim myDataView As System.Data.DataView
myDataView = New System.Data.DataView(aDataSet.Tables(0))
myDataView.RowFilter = "Artist like '" + prefixText + "%'"
For i = 0 To myDataView.Count - 1
If ht.Contains(myDataView.Item(i).Item(_
"Artist").ToString.Trim) = False Then
ht.Add(myDataView.Item(i).Item(_
"Artist").ToString.Trim, _
myDataView.Item(i).Item(_
"Artist").ToString.Trim)
End If
Next
Dim myList As ArrayList
myList = New ArrayList(ht)
Dim anArray(myList.Count - 1) As String
For i = 0 To myList.Count - 1
anArray(i) = myList.Item(i).Value
Next
Return anArray
Catch ex As Exception
End Try
Return Nothing
End Function
为了让 AutoCompleteExtender
控件工作,你显然需要 have the Atlas framework 安装在你的 Web 服务器上。此外,你还需要在 web.config 中添加一些特殊的节点才能使其正常工作。这些节点是
<httpHandlers>
<remove verb="*" path="*.asmx"/>
<add verb="*" path="*.asmx"
type="Microsoft.Web.Services.ScriptHandlerFactory"
validate="false"/>
<add verb="*" path="atlasbatchcall.axd"
type="Microsoft.Web.Services.MultiRequestHandler"
validate="false"/>
<add verb="*" path="atlasglob.axd"
type="Microsoft.Web.Globalization.GlobalizationHandler"
validate="false"/>
<add verb="*" path="*.asbx"
type="Microsoft.Web.Services.ScriptHandlerFactory"
validate="false"/>
</httpHandlers>
<httpModules>
<add name="ScriptModule" type="Microsoft.Web.Services.ScriptModule"/>
<add name="BridgeModule" type="Microsoft.Web.Services.BridgeModule"/>
<add name="WebResourceCompression"
type="Microsoft.Web.Services.WebResourceCompressionModule"/>
</httpModules>
在使用 Atlas 控件的 Web 页面中,你还需要添加的一些其他项目。
<atlas:ScriptManager runat="server"
id="scriptManager" EnablePartialRendering="true" />
在创建和配置了所有这些之后,我得到了类似以下的结果。
总而言之,我希望这个小型项目能将一些控件和技术整合起来,因为它提供了一个真实大小的示例。特别是,提供了一个可行的示例,内容如下:
- Atlas 框架和
AutoCompleteExtender
控件。 - 会员服务以及相关的
CreateUserWizard
、LoginView
控件以及Profile
对象。 - 将 XML 数据源加载到
DataView
和GridView
中。
我接下来要在这个网站上实现的项目是添加一个流媒体组件,这样我就可以在工作时流式传输我的音乐。
我希望你觉得这篇文章很有趣。欢迎随意获取代码并按你认为合适的方式使用它。