找经‍纪‍人的平‍台有吗,是哪个?

关于WEB Service&WCF&WebApi实现身份验证之WCF篇(1)
WCF身份验证一般常见的方式有:自定义用户名及密码验证、X509证书验证、ASP.NET成员资格(membership)验证、SOAP Header验证、Windows集成验证、WCF身份验证服务(AuthenticationService),这些验证方式其实网上都有相关的介绍文章,我这里算是一个总结吧,顺便对于一些注意细节进行说明,以便大家能更好的掌握这些知识。第一种:自定义用户名及密码验证(需要借助X509证书)由于该验证需要借助于X509证书,所以我们需要先创建一个证书,可以利用MS自带的makecert.exe程序来制作测试用证书,使用步骤:请依次打开开始-&Microsoft Visual Studio 2010(VS菜单,版本不同,名称有所不同)-&Visual Studio Tools-&Visual Studio 命令提示,然后执行以下命令:makecert -r -pe -n "CN=ZwjCert" -ss TrustedPeople -sr LocalMachine -sky exchange上述命令中除了我标粗的部份可改成你实际的请求外(为证书名称),其余的均可以保持不变,命令的意思是:创建一个名为ZwjCert的证书将将其加入到本地计算机的受信任人区域中。如果需要查看该证书,那么可以通过MMC控制台查询证书,具体操作步骤如下:运行-&MMC,第一次打开Windows没有给我们准备好直接的管理证书的入口,需要自行添加,添加方法如下:1. 在控制台菜单,文件&添加/删除管理单元&添加按钮&选&证书&&添加&选&我的用户账户&&关闭&确定2. 在控制台菜单,文件&添加/删除管理单元&添加按钮&选&证书&&添加&选&计算机账户&&关闭&确定这样MMC中左边就有菜单了,然后依次展开:证书(本地计算机)-&受信任人-&证书,最后就可以在右边的证书列表中看到自己的证书了,如下图示:&证书创建好,我们就可以开始编码了,本文主要讲的就是WCF,所以我们首先定义一个WCF服务契约及服务实现类(后面的各种验证均采用该WCF服务),我这里直接采用默认的代码,如下:namespace WcfAuthentications{ [ServiceContract] public interface IService1 { [OperationContract] string GetData(int value); [OperationContract] CompositeType GetDataUsingDataContract(CompositeType composite); } [DataContract] public class CompositeType { bool boolValue = string stringValue = "Hello "; [DataMember] public bool BoolValue { get { return boolV } set { boolValue = } } [DataMember] public string StringValue { get { return stringV } set { stringValue = } } }}namespace WcfAuthentications{ public class Service1 : IService1 { public string GetData(int value) { return string.Format("You entered: {0}", value); } public CompositeType GetDataUsingDataContract(CompositeType composite) { if (composite == null) { throw new ArgumentNullException("composite"); } if (composite.BoolValue) { composite.StringValue += "Suffix"; } } }}要实现用户名及密码验证,就需要定义一个继承自UserNamePasswordValidator的用户名及密码验证器类CustomUserNameValidator,代码如下:namespace WcfAuthentications{ public class CustomUserNameValidator : UserNamePasswordValidator { public override void Validate(string userName, string password) { if (null == userName || null == password) { throw new ArgumentNullException(); } if (userName != "admin" && password != "wcf.admin") //这里可依实际情况下实现用户名及密码判断 { throw new System.IdentityModel.Tokens.SecurityTokenException("Unknown Username or Password"); } } }}代码很简单,只是重写其Validate方法,下面就是将创建WCF宿主,我这里采用控制台程序代码部份:namespace WcfHost{ class Program { static void Main(string[] args) { using (var host = new ServiceHost(typeof(Service1))) { host.Opened += delegate { Console.WriteLine("Service1 Host已开启!"); }; host.Open(); Console.ReadKey(); } } }}APP.CONFIG部份(这是重点,可以使用WCF配置工具来进行可视化操作配置,参见:/Moosdau/archive//2019002.html): &system.serviceModel& &bindings& &wsHttpBinding& &binding name="Service1Binding"& &security mode="Message"& &message clientCredentialType="UserName" /& &/security& &/binding& &/wsHttpBinding& &/bindings& &services& &service behaviorConfiguration="Service1Behavior" name="WcfAuthentications.Service1"& &endpoint address="" binding="wsHttpBinding" bindingConfiguration="Service1Binding" contract="WcfAuthentications.IService1"& &identity& &dns value="ZwjCert" /& &/identity& &/endpoint& &endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /& &host& &baseAddresses& &add baseAddress="http://localhost:8732/WcfAuthentications/Service1/" /& &/baseAddresses& &/host& &/service& &/services& &behaviors& &serviceBehaviors& &behavior name="Service1Behavior"& &serviceMetadata httpGetEnabled="true" /& &serviceDebug includeExceptionDetailInFaults="false" /& &serviceCredentials& &serviceCertificate findValue="ZwjCert" x509FindType="FindBySubjectName" storeLocation="LocalMachine" storeName="TrustedPeople" /& &userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="WcfAuthentications.CustomUserNameValidator,WcfAuthentications" /& &/serviceCredentials& &/behavior& &/serviceBehaviors& &/behaviors& &/system.serviceModel&这里面有几个需要注意的点:1.&dns value="ZwjCert" /&与&serviceCertificate findValue="ZwjCert" ..&中的value必需都为证书的名称,即:ZwjCert;2.Binding节点中需配置security节点,message子节点中的clientCredentialType必需设为:UserName;3.serviceBehavior节点中,需配置serviceCredentials子节点,其中serviceCertificate 中各属性均需与证书相匹配,userNameAuthentication的userNamePasswordValidationMode必需为Custom,customUserNamePasswordValidatorType为上面自定义的用户名及密码验证器类的类型及其程序集最后就是在客户端使用了,先引用服务,然后看下App.Config,并进行适当的修改,如下: &system.serviceModel& &bindings& &wsHttpBinding& &binding name="WSHttpBinding_IService1" & &security mode="Message"& &transport clientCredentialType="Windows" proxyCredentialType="None" realm="" /& &message clientCredentialType="UserName" negotiateServiceCredential="true" algorithmSuite="Default" /& &/security& &/binding& &/wsHttpBinding& &/bindings& &client& &endpoint address="http://localhost:8732/WcfAuthentications/Service1/" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IService1" contract="ServiceReference1.IService1" name="WSHttpBinding_IService1"& &identity& &dns value="ZwjCert" /& &/identity& &/endpoint& &/client& &/system.serviceModel&为了突出重点,我这里对Binding节点进行了精简,去掉了许多的属性配置,仅保留重要的部份,如:security节点,修改其endpoint下面的identity中&dns value="ZwjCert" /&,这里的value与服务中所说的相同节点相同,就是证书名称,如果不相同,那么就会报错,具体的错误消息大家可以自行试下,我这里限于篇幅内容就不贴出来了。客户端使用服务代码如下:namespace WCFClient{ class Program { static void Main(string[] args) { using (var proxy = new ServiceReference1.Service1Client()) { proxy.ClientCredentials.UserName.UserName = "admin"; proxy.ClientCredentials.UserName.Password = "wcf.admin"; string result = proxy.GetData(1); Console.WriteLine(result); var compositeObj = proxy.GetDataUsingDataContract(new CompositeType() { BoolValue = true, StringValue = "test" }); Console.WriteLine(SerializerToJson(compositeObj)); } Console.ReadKey(); } /// &summary& /// 序列化成JSON字符串 /// &/summary& static string SerializerToJson&T&(T obj) where T:class { var serializer = new DataContractJsonSerializer(typeof(T)); var stream = new MemoryStream(); serializer.WriteObject(stream,obj); byte[] dataBytes = new byte[stream.Length]; stream.Position = 0; stream.Read(dataBytes, 0, (int)stream.Length); string dataString = Encoding.UTF8.GetString(dataBytes); return dataS } }}运行结果如下图示: 如果不传入用户名及密码或传入不正确的用户名及密码,均会报错:第二种:X509证书验证首先创建一个证书,我这里就用上面创建的一个证书:ZwjC由于服务器端及客户端均需要用到该证书,所以需要导出证书,在客户端的电脑上导入该证书,以便WCF可进行验证。WCF服务契约及服务实现类与第一种方法相同,不再重贴代码。WCF服务器配置如下: &system.serviceModel& &bindings& &wsHttpBinding& &binding name="Service1Binding"& &security mode="Message"& &message clientCredentialType="Certificate" /& &/security& &/binding& &/wsHttpBinding& &/bindings& &services& &service behaviorConfiguration="Service1Behavior" name="WcfAuthentications.Service1"& &endpoint address="" binding="wsHttpBinding" bindingConfiguration="Service1Binding" contract="WcfAuthentications.IService1"& &/endpoint& &endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /& &host& &baseAddresses& &add baseAddress="http://127.0.0.1:8732/WcfAuthentications/Service1/" /& &/baseAddresses& &/host& &/service& &/services& &behaviors& &serviceBehaviors& &behavior name="Service1Behavior"& &serviceMetadata httpGetEnabled="true" /& &serviceDebug includeExceptionDetailInFaults="false" /& &serviceCredentials& &serviceCertificate findValue="ZwjCert" x509FindType="FindBySubjectName" storeLocation="LocalMachine" storeName="TrustedPeople" /& &clientCertificate& &authentication certificateValidationMode="None"/& &/clientCertificate& &/serviceCredentials& &/behavior& &/serviceBehaviors& &/behaviors& &/system.serviceModel&这里需注意如下几点:1.&message clientCredentialType="Certificate" /&clientCredentialType设为:Certificate;2.需配置serviceCredentials节点,其中serviceCertificate 中各属性均需与证书相匹配,clientCertificate里面我将authentication.certificateValidationMode="None",不设置采用默认值其实也可以;客户端引用服务,自动生成如下配置信息: &system.serviceModel& &bindings& &wsHttpBinding& &binding name="WSHttpBinding_IService1"& &security mode="Message"& &transport clientCredentialType="Windows" proxyCredentialType="None" realm="" /& &message clientCredentialType="Certificate" negotiateServiceCredential="true" algorithmSuite="Default" /& &/security& &/binding& &/wsHttpBinding& &/bindings& &client& &endpoint address="http://127.0.0.1:8732/WcfAuthentications/Service1/" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IService1" contract="ServiceReference1.IService1" name="WSHttpBinding_IService1" behaviorConfiguration="Service1Nehavior"& &identity& &certificate encodedValue="AwAAAAEAAAAUAAAAkk2avjNCItzUlS2+Xj66ZA2HBZYgAAAAAQAAAOwBAAAwggHoMIIBVaADAgECAhAIAOzFvLxLuUhHJRwHUUh9MAkGBSsOAwIdBQAwEjEQMA4GA1UEAxMHWndqQ2VydDAeFw0xNTEyMDUwMjUyMTRaFw0zOTEyMzEyMzU5NTlaMBIxEDAOBgNVBAMTB1p3akNlcnQwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALfGfsiYpIVKu3gPJl790L13+CZWt6doePZHmcjMl+xPQKIR2fDvsCq9ZxzapDgiG4T3mgcVKUv55DBiuHcpXDvXt28m49AjdKwp924bOGKPM56eweKDCzYfLxy5SxaZfA9qjUhnPq3kGu1lfWjXbsp1rKI1UhKJg5b2j0V7AOC3AgMBAAGjRzBFMEMGA1UdAQQ8MDqAEH/MEXV8FHNLtxvllQ5SMbihFDASMRAwDgYDVQQDEwdad2pDZXJ0ghAIAOzFvLxLuUhHJRwHUUh9MAkGBSsOAwIdBQADgYEAdBtBNTK/Aj3woH2ts6FIU3nh7FB2tKQ9L3k6QVL+kCR9mHuqWtYFJTBKxzESN2t0If6muiktcO+C8iNwYpJpPzLAOMFMrTQhkO82gcdr9brQzMWPTraK1IS+GGH8QBIOTLx9zfV/iCIXxRub+Sq9dmRSQjKDeLeHWoE5I6FkQJg=" /& &/identity& &/endpoint& &/client& &behaviors& &endpointBehaviors& &behavior name="Service1Nehavior"& &clientCredentials& &clientCertificate findValue="ZwjCert" x509FindType="FindBySubjectName" storeLocation="LocalMachine" storeName="TrustedPeople" /& &/clientCredentials& &/behavior& &/endpointBehaviors& &/behaviors& &/system.serviceModel&可以看出endpoint节点下的identity.certificate的encodedValue包含了加密的数据,另外需要手动增加clientCertificate配置信息,该信息表示证书在本地电脑存放的位置,当然也可以通过代码来动态指定,如:proxy.ClientCredentials.ClientCertificate.SetCertificate("ZwjCert", StoreLocation.LocalMachine, StoreName.My);客户端使用服务代码如下: static void Main(string[] args) { using (var proxy = new ServiceReference1.Service1Client()) { //proxy.ClientCredentials.ClientCertificate.SetCertificate("ZwjCert", StoreLocation.LocalMachine, StoreName.My); //直接动态指定证书存储位置 string result = proxy.GetData(1); Console.WriteLine(result); var compositeObj = proxy.GetDataUsingDataContract(new CompositeType() { BoolValue = true, StringValue = "test" }); Console.WriteLine(SerializerToJson(compositeObj)); } Console.ReadKey(); }网上还有另类的针对X509证书验证,主要是采用了自定义的证书验证器类,有兴趣的可以参见这篇文章:/ejiyuan/archive//1748363.html第三种:ASP.NET成员资格(membership)验证&由于该验证需要借助于X509证书,所以仍然需要创建一个证书(方法如第一种中创建证书方法相同):ZwjC由于该种验证方法是基于ASP.NET的membership,所以需要创建相应的数据库及创建账号,创建数据库,请通过运行aspnet_regsql.exe向导来创建数据库及其相关的表,通过打开ASP.NET&网站管理工具(是一个自带的管理网站),并在上面创建角色及用户,用于后续的验证;这里特别说明一下,若采用VS2013,VS上是没有自带的GUI按钮来启动该管理工具网站,需要通过如下命令来动态编译该网站:cd C:/Program Files/IIS Expressiisexpress.exe /path:C:/Windows/Microsoft.NET/Framework/v4.0.30319/ASP.NETWebAdminFiles /vpath:/WebAdmin /port:12345 /clr:4.0 /ntlm编译时若出现报错:&System.Configuration.StringUtil&不可访问,因为它受保护级别限制,请将WebAdminPage.cs中代码作如下修改://取消部份:string appId = StringUtil.GetNonRandomizedHashCode(String.Concat(appPath, appPhysPath)).ToString("x", CultureInfo.InvariantCulture);//新增加部份:Assembly sysConfig = Assembly.LoadFile(@"C:/Windows/Microsoft.NET/Framework/v4.0.30319/System.Configuration.dll");Type sysConfigType = sysConfig.GetType("System.Configuration.StringUtil");string appId = ((int)sysConfigType.GetMethod("GetNonRandomizedHashCode").Invoke(null, new object[] { String.Concat(appPath, appPhysPath), true })).ToString("x", CultureInfo.InvariantCulture);这样就可以按照命令生生成的网址进行访问就可以了。如果像我一样,操作系统为:WINDOWS 10,那么不好意思,生成的网站虽然能够打开,但仍会报错:遇到错误。请返回上一页并重试。目前没有找到解决方案,网上有说ASP.NET网站管理工具在WIN10下不被支持,到底为何暂时无解,若大家有知道的还请分享一下(CSDN有别人的求问贴:http://bbs.csdn.net/topics/),非常感谢,我这里就只好换台电脑来运行ASP.NET管理工具网站了。&WCF服务端配置如下: &connectionStrings& &add name="SqlConn" connectionString="Server=.;Database=Uid=Pwd=;"/& &/connectionStrings& &system.web& &compilation debug="true" targetFramework="4.5" /& &httpRuntime targetFramework="4.5"/& &membership defaultProvider="SqlMembershipProvider"& &providers& &clear/& &add name="SqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="SqlConn" applicationName="/" enablePasswordRetrieval="false" enablePasswordReset="false" requiresQuestionAndAnswer="false" requiresUniqueEmail="true" passwordFormat="Hashed"/& &/providers& &/membership& &/system.web& &system.serviceModel& &behaviors& &serviceBehaviors& &behavior name="Service1Behavior"& &serviceCredentials& &serviceCertificate findValue="ZwjCert" storeLocation="LocalMachine" storeName="TrustedPeople" x509FindType="FindBySubjectName" /& &userNameAuthentication userNamePasswordValidationMode="MembershipProvider" membershipProviderName="SqlMembershipProvider" /& &/serviceCredentials& &serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /& &serviceDebug includeExceptionDetailInFaults="false" /& &/behavior& &/serviceBehaviors& &/behaviors& &bindings& &wsHttpBinding& &binding name="Service1Binding"& &security mode="Message"& &message clientCredentialType="UserName"/& &/security& &/binding& &/wsHttpBinding& &/bindings& &serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /& &services& &service name="WcfService1.Service1" behaviorConfiguration="Service1Behavior"& &endpoint address="" binding="wsHttpBinding" contract="WcfService1.IService1" bindingConfiguration="Service1Binding"& &/endpoint& &/service& &/services& &/system.serviceModel&这里需注意几点:1.配置connectionString,连接到membership所需的数据库;&2.配置membership,增加SqlMembershipProvider属性配置;3.配置serviceCredential,与第一种基本相同,不同的是userNameAuthentication的配置:userNamePasswordValidationMode="MembershipProvider",membershipProviderName="SqlMembershipProvider";4.配置Binding节点&message clientCredentialType="UserName"/&,这与第一种相同;&客户端引用WCF服务,查看生成的配置文件内容,需确保Binding节点有以下配置信息:&security mode="Message"& &message clientCredentialType="UserName" /& &/security&最后使用WCF服务,使用代码与第一种相同,唯一需要注意的是,传入的UserName和Password均为ASP.NET网站管理工具中创建的用户信息。另外我们也可以采用membership+Form验证,利用ASP.NET的身份验证机制,要实现这种模式,是需要采用svc文件,并寄宿在IIS上,具体实现方法,参见:/danielWise/archive//1947912.html由于WCF的验证方法很多,本文无法一次性全部写完,敬请期待续篇!
分享给朋友:
------分隔线----------------------------
您可能感兴趣的文章:
随机阅读:现在的中国已经病入膏肓-----良药在哪?
中国经过这么多年的发展,取得了丰硕的成果,但是由于太注重取得经济效益,以致忽视了精神文明,特别是道德的建设,造成了人们的空虚和迷茫。就象温家宝说的,中国现在的问题是权力过分集中,缺少监督。既然中央都看到问题的所在了,相信一定会找到解决问题办法,也许腐败的日子快要到头了。其实我觉得中国最好的老师就是香港,同是华人社会,同样在六七十年代也很腐败,何以香港今天能如此清明,答案就是权力是由人民监督审察的,有些部分根本就不给你腐败的机会,如法院审案子,它是由人民陪审员来栽决的。所以我认为良药是有的,中国不需要做大的改变,只需设立人民陪审员制度,设立人民监察机构等等人民参与的机构,怎么可能会有再有腐败产生呢。是时候对腐败开战了,趁早不趁晚!
@11-09-14 15:33:40LZ别天真,自己都说了病入膏盲。&&&&&&&&&&&&&&&&&&&&&破而后立啊!!!!!!!-----------------------------作为一个有良知的中国人,很为你的说法担忧啊,我劝老弟千万别轻言破立之言。请你先看看俄罗斯,它破了么,破了。立了么,也立了,但俄国人民的生活水平还不如前苏联时期呢,这说明了什么,一旦发生破立,受害最深的一定还是咱老百姓,而受益最大的是拥有权力的人。既然破立不能给人民带来好处,又何必言破立呢,更重要是中央已经下决心打击腐败了,相信中国明天会象香港一样清明。
竞争机制,能者上位,不应当只局限于人民的就业里,应当用到执政D身上,这个D搞不好,就滚蛋.监督与监控,不应只作用于人民身上,政府也应当接受人民的监督,宪法必须严格执行,以确保人民行使监督政府行为的一切权利.一切独裁思想与维持独裁政权稳定的暴力手段必须得到清除.做到以上,中国方可走入良好有序的可持续发展的社会之路.
已经无可救药了!
我也来看一下
都是哪些症状?光顾 春舞枝
楼主说那些都还其次~中国现在最大的问题是贪,腐!!!国家或许有很多好政策但是一些东西下到地方就变味~变质了!!!现在但凡有点点的权的都会或多或少的贪的~~中国的风光只是表象~如果长此以往真不知道中国的明天会怎么样!问题多多呀~哎!不知道我们的政府会怎么处理这么多的问题和矛盾!现在只希望在种种矛盾没有完全被激化的时候~会被一一化解~~~~~~~希望吧!愿我的祖国繁荣昌盛!!!
5毛他爹是谁啊:胡老板啊。胡老搞出来的5毛。
苦口良药。。。找方向。。。
我打酱油路过的...
本来就是吹逼吹出来的,这个鸟国本来就是个朝代,其实就是官匪,就是个立山头做大王的
死了一了百了
@zwjpop  16:06:44@11-09-14 15:33:40LZ别天真,自己都说了病入膏盲。&&&&&&&&&&&&&&&&&&&&&破而后立啊!!!!!!!-----------------------------作为一个有良知的中国人,很为你的说法担忧啊,我劝老弟千万别轻言破立之言。请你先看看俄罗斯,它破了么,破了。立了么,也立了,但俄国人民的生活水平还不如前苏联时期呢,这说明了什么,一旦发生破立,受害最深的一定还是咱老百姓,而受益最大的是拥有权力的人。既然破立不能给人民带来好处,又何必言破立呢,更重要是中央已经下决心打击腐败了,相信中国明天会象香港一样清明。
=========================咳 痴人说梦 远华案大吧 最后呢?
匪盗猖獗,就像一个北边的大学里人说的东北人不论啥层次说话都带痞气,同样道理这个鸟国家的人不论哪路高官还是平头的咋看咋不正经,不信你电视看看出场摆拍的那群狗官怎么装都有匪气
物价上涨就是拉动内需的方法,居民不是不主动消费嘛,涨价啊,买一个东西付三倍的钱不就实现拉动的目的了。
其实红d在世界范围内早就垮塌了,苏联早就从勃列日涅夫开始大幅度被d匪瓜分了,对于鸟国也是一样说没变不可能,但是鸟国就和大便一样嘴臭不承认就像本来就鸡巴一个封建的,村落多个族群凑出来的一个比国,总鸡巴在那里张个臭嘴中华文明本来就是从西方婊着美国照抄照搬来的还鸡巴中国特别的色。区别也就在这里,像苏联这种民族玩咱就痛快玩。
只顶 不敢说
大家还在看大家都在搜:
扫描二维码安装搜房网房天下APP
手机浏览器访问搜房网房天下
> > 问题详情
东莞长虹百荟现在有特价房吗?
浏览次数:0
回答被采纳后将共获得20
BEAUAMPNITZWJUVC
位提问人正在寻找答案
手机动态登录
请输入用户名/邮箱/手机号码!
请输入密码!
没有搜房通行证,
ask:2,asku:1,askr:409,askz:24,askd:10askR:1,askD:452 mz:nohit,askU:0,askT:0askA:456
Copyright &
北京拓世宏业科技发展有限公司
Beijing Tuo Shi Hong Ye Science&Technology Development Co.,Ltd 版权所有
客服电话: 400-850-8888 违法信息举报邮箱:31593人阅读
<span style="color:#進表記
<span style="color:#進表記
<span style="color:#1
quotation mark = APL quote
<span style="color:#2
<span style="color:#3
less-than sign
<span style="color:#4
greater-than sign
<span style="color:#5
no-break space = non-breaking space
iSO 8859-1 characters
char glyph
Math symbols
Latin Extended-B
char glyph
char glyph
Mathematical Operators
char glyph
General Punctuation
char glyph
Miscellaneous Technical
char glyph
Geometric Shapes
char glyph
Miscellaneous Symbols
char glyph
Letterlike Symbols
char glyph
char glyph
Special characters for HTML
C0 Controls and Basic Latin
char glyph
Latin Extended-A
char glyph
Spacing Modifier Letters
char glyph
General Punctuation
char glyph
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:562966次
积分:4771
积分:4771
排名:第4876名
原创:79篇
转载:109篇
评论:61条
(1)(3)(2)(1)(2)(2)(2)(3)(7)(1)(1)(1)(5)(9)(3)(9)(10)(12)(21)(22)(6)(1)(4)(3)(5)(3)(1)(1)(1)(1)(5)(1)(3)(1)(6)(1)(3)(1)(9)(2)(2)(3)(3)(6)

我要回帖

更多关于 平纪上海话配音 的文章

 

随机推荐