用户代码未处理invalidOperationexception report

用户代码未处理(Exception),System.NullReferenceException: 未将对象引用设置到对象的实例。
以下代码中红色部分是运行时指出的错误,共3处
using System.Web.UI.WebCusing System.Web.UI.WebControls.WebPusing System.Web.UI.HtmlCusing BookS
public partial class LeftTree : System.Web.UI.Page{
protected void Page_Load(object sender, EventArgs e)
if (Session[&RoleID&] != null)
AdminOperationPanel.Visible = Session[&RoleID&].ToString() == &1& ? true :
///显示树型菜单
if (!Page.IsPostBack)
///显示树型结构
InitCategoryTree();
private void InitCategoryTree()
Category category = new Category();
category.InitCategory(CategoryView, &Book/BrowserBook.aspx&);
using Susing System.Dusing System.Cusing System.Wusing System.Web.Susing System.Web.UI;using System.Web.UI.WebCusing System.Web.UI.WebControls.WebPusing System.Web.UI.HtmlCusing System.Data.SqlCusing SQLH
namespace BookShop{
/// &summary&
/// Summary description for Category
/// &/summary&
public class Category
public void InitCategory(TreeView treeView,string sNodeUrl)
Category category = new Category();
System.Data.DataTable dataTable = new DataTable();
dataTable = SystemTools.ConvertDataReaderToDataTable(category.GetCategorys());
treeView.Nodes.Clear();
///清空树的所有节点
DataRow[] rowList = dataTable.Select(&ParentID='-1'&);
if (rowList.Length &= 0)
///创建根节点
TreeNode rootNode = new TreeNode();
///设置根节点属性
rootNode.Text = rowList[0][&Desn&].ToString();
rootNode.Value = rowList[0][&CategoryID&].ToString(); ///设置根节点的Key值
rootNode.Expanded =
rootNode.Selected =
rootNode.NavigateUrl = sNodeUrl + &?CategoryID=& + rowList[0][&CategoryID&].ToString();
rootNode.Target = &MainFrame&;
///添加根节点
treeView.Nodes.Add(rootNode);
///创建其他节点
InitChildNode(rootNode,dataTable,sNodeUrl);
private void InitChildNode(TreeNode parentNode, DataTable dataTable, string sNodeUrl)
///选择数据时,添加了排序表达式OrderBy
DataRow[] rowList = dataTable.Select(&ParentID='& + parentNode.Value + &'&,&OrderBy&);
foreach (DataRow row in rowList)
///创建新节点
TreeNode node = new TreeNode();
///设置节点的属性
node.Text = row[&Desn&].ToString();
node.Value = row[&CategoryID&].ToString();
node.Expanded =
node.NavigateUrl = sNodeUrl + &?CategoryID=& + row[&CategoryID&].ToString();
node.Target = &MainFrame&;
parentNode.ChildNodes.Add(node);
///递归调用,创建其他节点
InitChildNode(node,dataTable,sNodeUrl);
public void BindCategoryTreeView(TreeView treeView, bool isExpanded,string sSelectedData)
Category category = new Category();
DataTable dataTable = SystemTools.ConvertDataReaderToDataTable(category.GetCategorys());
treeView.Nodes.Clear();
///清空树的所有节点
DataRow[] rowList = dataTable.Select(&ParentID='-1'&);
if (rowList.Length &= 0)
///创建根节点
TreeNode rootNode = new TreeNode();
///设置根节点属性
rootNode.Text = rowList[0][&Desn&].ToString();
rootNode.Value = rowList[0][&CategoryID&].ToString(); ///设置根节点的Key值
rootNode.Expanded = isE
rootNode.Selected =
///添加根节点
treeView.Nodes.Add(rootNode);
///创建其他节点
CreateChildNode(rootNode, dataTable, isExpanded,sSelectedData);
private void CreateChildNode(TreeNode parentNode, DataTable dataTable, bool isExpanded,
string sSelectedData)
///选择数据时,添加了排序表达式OrderBy
DataRow[] rowList = dataTable.Select(&ParentID='& + parentNode.Value + &'&,&OrderBy&);
foreach (DataRow row in rowList)
///创建新节点
TreeNode node = new TreeNode();
///设置节点的属性
node.Text = row[&Desn&].ToString();
node.Value = row[&CategoryID&].ToString();
node.Expanded = isE
if (node.Value == sSelectedData)
node.Selected =
parentNode.ChildNodes.Add(node);
///递归调用,创建其他节点
CreateChildNode(node, dataTable, isExpanded,sSelectedData);
public void BindCategoryTreeList(DropDownList categroyList)
int nDepth = 0;
Category category = new Category();
DataTable dataTable = SystemTools.ConvertDataReaderToDataTable(category.GetCategorys());
categroyList.Items.Clear();
///清空树的所有节点
DataRow[] rowList = dataTable.Select(&ParentID='-1'&);
if (rowList.Length &= 0)
///创建、添加根节点
categroyList.Items.Add(new ListItem(rowList[0][&Desn&].ToString(), rowList[0][&CategoryID&].ToString()));
///创建其他节点
CreateChildNode(categroyList, dataTable, Int32.Parse(rowList[0][&CategoryID&].ToString()), nDepth);
private void CreateChildNode(DropDownList categroyList, DataTable dataTable, int nParentID, int nDepth)
string sSpace = &&;
for (int i = 0; i & nDepth * 2; i++)
sSpace += &---&;
///选择数据时,添加了排序表达式OrderBy
DataRow[] rowList = dataTable.Select(&ParentID='& + nParentID.ToString() + &'&, &OrderBy&);
foreach (DataRow row in rowList)
///创建新节点
categroyList.Items.Add(new ListItem(sSpace + row[&Desn&].ToString(),
row[&CategoryID&].ToString()));
///递归调用,创建其他节点
CreateChildNode(categroyList, dataTable, Int32.Parse(row[&CategoryID&].ToString()), nDepth);
public SqlDataReader GetCategorys()
///定义类SQLHelper
SQLHelper.SQLHelper sqlHelper = new SQLHelper.SQLHelper();
///定义保存从数据库获取的结果的DataReader
SqlDataReader dr =
///执行存储过程
sqlHelper.RunProc(&Pr_GetCategorys&, out dr);
catch (Exception ex)
///抛出执行数据库异常
SystemError.CreateErrorLog(ex.Message);
throw new Exception(ex.Message, ex);
///返回从数据库获取的结果
return (dr);
public SqlDataReader GetSubCategorys(int nCategoryID)
///定义类SQLHelper
SQLHelper.SQLHelper sqlHelper = new SQLHelper.SQLHelper();
///定义保存从数据库获取的结果的DataReader
SqlDataReader dr =
///创建访问数据库的参数
SqlParameter[] paramList = {
sqlHelper.CreateInParam(&@CategoryID&,SqlDbType.Int,4,nCategoryID)
///执行存储过程
sqlHelper.RunProc(&Pr_GetSubCategorys&,paramList,out dr);
catch (Exception ex)
///抛出执行数据库异常
SystemError.CreateErrorLog(ex.Message);
throw new Exception(ex.Message,ex);
///返回从数据库获取的结果
return (dr);
public SqlDataReader GetSingleCategory(int nCategoryID)
///定义类SQLHelper
SQLHelper.SQLHelper sqlHelper = new SQLHelper.SQLHelper();
///定义保存从数据库获取的结果的DataReader
SqlDataReader dr =
///创建访问数据库的参数
SqlParameter[] paramList = {
sqlHelper.CreateInParam(&@CategoryID&,SqlDbType.Int,4,nCategoryID)
///执行存储过程
sqlHelper.RunProc(&Pr_GetSingleCategory&, paramList, out dr);
catch (Exception ex)
///抛出执行数据库异常
SystemError.CreateErrorLog(ex.Message);
throw new Exception(ex.Message, ex);
///返回从数据库获取的结果
return (dr);
public int AddCategory(string sDesn, int nParentID,int nOrderBy,string sRemark)
///定义类SQLHelper
SQLHelper.SQLHelper sqlHelper = new SQLHelper.SQLHelper();
///创建访问数据库的参数
SqlParameter[] paramList = {
sqlHelper.CreateInParam(&@Desn&,SqlDbType.VarChar,200,sDesn),
sqlHelper.CreateInParam(&@ParentID&,SqlDbType.Int,4,nParentID),
sqlHelper.CreateInParam(&@OrderBy&,SqlDbType.Int,4,nOrderBy),
sqlHelper.CreateInParam(&@Remark&,SqlDbType.VarChar,8000,sRemark)
///执行存储过程
return (sqlHelper.RunProc(&Pr_AddCategory&, paramList));
catch (Exception ex)
///抛出执行数据库异常
SystemError.CreateErrorLog(ex.Message);
throw new Exception(ex.Message, ex);
public void UpdateCategory(int nCategoryID,string sDesn,string sRemark)
///定义类SQLHelper
SQLHelper.SQLHelper sqlHelper = new SQLHelper.SQLHelper();
///创建访问数据库的参数
SqlParameter[] paramList = {
sqlHelper.CreateInParam(&@CategoryID&,SqlDbType.Int,4,nCategoryID),
sqlHelper.CreateInParam(&@Desn&,SqlDbType.VarChar,200,sDesn),
sqlHelper.CreateInParam(&@Remark&,SqlDbType.VarChar,8000,sRemark)
///执行存储过程
sqlHelper.RunProc(&Pr_UpdateCategory&, paramList);
catch (Exception ex)
///抛出执行数据库异常
SystemError.CreateErrorLog(ex.Message);
throw new Exception(ex.Message, ex);
public void UpdateCategoryOrder(int nCategoryID,string sMoveFlag)
///定义类SQLHelper
SQLHelper.SQLHelper sqlHelper = new SQLHelper.SQLHelper();
///创建访问数据库的参数
SqlParameter[] paramList = {
sqlHelper.CreateInParam(&@CategoryID&,SqlDbType.Int,4,nCategoryID),
sqlHelper.CreateInParam(&@MoveFlag&,SqlDbType.VarChar,20,sMoveFlag)
///执行存储过程
sqlHelper.RunProc(&Pr_UpdateCategoryOrder&, paramList);
catch (Exception ex)
///抛出执行数据库异常
SystemError.CreateErrorLog(ex.Message);
throw new Exception(ex.Message, ex);
public void DeleteCategory(int nCategoryID)
///定义类SQLHelper
SQLHelper.SQLHelper sqlHelper = new SQLHelper.SQLHelper();
///创建访问数据库的参数
SqlParameter[] paramList = {
sqlHelper.CreateInParam(&@CategoryID&,SqlDbType.Int,4,nCategoryID)
///执行存储过程
sqlHelper.RunProc(&Pr_DeleteCategory&, paramList);
catch (Exception ex)
///抛出执行数据库异常
SystemError.CreateErrorLog(ex.Message);
throw new Exception(ex.Message, ex);
dataTable = SystemTools.ConvertDataReaderToDataTable(category.GetCategorys());
这句的作用应该是把DataReader转化成DataTable吧?如果DataReader中的数据为空可能导致此问题~
Microsoft 正在进行一项网上调查,以了解您对 Msdn 网站的意见。如果您选择参加,我们将会在您离开 Msdn 网站时向您显示该网上调查。是否要参加?
<input type="hidden" id="hdnTrackerText" value="请不要关闭此窗口。谢谢!完成访问时,调查将显示在此处,所以请不要关闭此窗口。" />WCF CallBack - 般若菠萝蜜 - 51Testing软件测试网 51Testing软件测试网-中国软件测试人的精神家园 - Powered by X-Space
共同探讨QTP相关问题
WCF CallBack
& 20:31:20
/ 个人分类:
Callback 机制又被称之为 "duplex call",说白了就是在原有基础上,为客户端也添加一个服务端点,让服务器能调用这个客户端 "服务",从而实现所谓的回调机制。也正因为如此,通讯 binding 就必须支持双向通讯能力(bidirectional-capable),通常我们会选择 WSDualHttpBinding、NetTcpBinding 以及 NetNamedPipeBinding。接下来,我们回忆一下 Callback 的开发步骤。1. 创建服务契约。
[ServiceContract(SessionMode=SessionMode.Required)]public interface IService{&&[OperationContract]&&void Test();}2. 定义回调接口。由于回调接口的实现类型在客户端执行,因此无需添加 ServiceContract。
public interface ICallBack{&&[OperationContract]&&void Execute(DateTime d);}3. 实现服务契约。我们可以使用 "OperationContext.Current.GetCallbackChannel&T&()" 来回调客户端 "Callback"。
public class MyService : IService, IDisposable{&&public void Test()&&{&&&&Console.WriteLine("Service Invoke CallBack...");&&&&OperationContext.Current.GetCallbackChannel&ICallBack&().Execute(DateTime.Now);&&}&&public void Dispose()&&{&&&&Console.WriteLine("Dispose:{0}", DateTime.Now);&&}}4. 创建 ServiceHost。注意发布 Metadata。
ServiceHost host = new ServiceHost(typeof(MyService), new Uri("http://localhost:8080/myservice"));host.AddServiceEndpoint(typeof(IService), new WSDualHttpBinding(), "");ServiceMetadatabehavīor metadata = new ServiceMetadatabehavīor();metadata.HttpGetEnabled =host.Descrīption.behavīors.Add(metadata);host.Open();5. 使用 Svcutil.exe 或 VS2005 创建客户端代理。
//------------------------------------------------------------------------------// &auto-generated&// &&此代码由工具生成。// &&运行库版本:2.0.50727.42//// &&对此文件的更改可能会导致不正确的行为,并且如果// &&重新生成代码,这些更改将会丢失。// &/auto-generated&//------------------------------------------------------------------------------namespace ConsoleApplication1.localhost{&&[GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]&&[ServiceContractAttribute(ConfigurationName = "ConsoleApplication1.localhost.IService", CallbackContract = typeof(IServiceCallback), SessionMode = SessionMode.Required)]&&public interface IService&&{&&&&[OperationContractAttribute(Action = "http://.../IService/Test", ReplyAction = "http://.../IService/TestResponse")]&&&&void Test();&&}&&[GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]&&public interface IServiceCallback&&{&&&&[OperationContractAttribute(Action = "http://.../IService/Execute", ReplyAction = "http://.../IService/ExecuteResponse")]&&&&void Execute(System.DateTime d);&&}&&[GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]&&public interface IServiceChannel : IService, IClientChannel&&{&&}&&[DebuggerStepThroughAttribute()]&&[GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]&&public partial class ServiceClient : DuplexClientBase&IService&, IService&&{&&&&public ServiceClient(System.ServiceModel.InstanceContext callbackInstance)&&&&&&: base(callbackInstance)&&&&{&&&&}&&&&public void Test()&&&&{&&&&&&base.Channel.Test();&&&&}&&}}6. 创建客户端回调接口的实现类型。
class CallBack : IServiceCallback{&&public void Execute(DateTime d)&&{&&&&Console.WriteLine("Client:{0}", d);&&}}7. 为客户端自动生成的配置文件添加 clientBaseAddress。服务器通过这个地址调用客户端回调服务。在同一台机器上调试,注意使用一个不同的端口。
&?xml version="1.0" encoding="utf-8" ?&&configuration&&&&system.serviceModel&&&&&&bindings&&&&&&&&wsDualHttpBinding&&&&&&&&&&binding name="WSDualHttpBinding_IService" clientBaseAddress="http://localhost:8081/" &&&&&&&&&&/binding&&&&&&&&/wsDualHttpBinding&&&&&&/bindings&&&&&&client&&&&&&&&endpoint address="http://localhost:8080/myservice" binding="wsDualHttpBinding"&&&&&&&&bindingConfiguration="WSDualHttpBinding_IService" contract="ConsoleApplication1.localhost.IService"&&&&&&&&name="WSDualHttpBinding_IService"&&&&&&&&&&identity&&&&&&&&&&&&userPrincipalName value="HZH\Administrator" /&&&&&&&&&&/identity&&&&&&&&/endpoint&&&&&&/client&&&&/system.serviceModel&&/configuration&8. 创建客户端调用代码。
InstanceContext instance = new InstanceContext(new CallBack());using (ServiceClient client = new ServiceClient(instance)){&&client.Test();}运行,看看结果。你看到了什么?异常!!!
用户代码未处理 System.InvalidOperationException&&Message="This operation would deadlock because the reply cannot be received until the current Message completes processing. If you want to allow out-of-order message processing, specify ConcurrencyMode of Reentrant or Multiple on ServicebehavīorAttribute."&&Source="mscorlib"&&StackTrace:&&&&Server stack trace: &&&&&&在 System.ServiceModel.Channels.ServiceChannel.PrepareCall(ProxyOperationRuntime operation, Boolean oneway, ProxyRpc& rpc)死锁(deadlock)?没错,你找到了让本文继续下去的理由。在缺省情况下,服务实例是 single-threaded (ConcurrencyMode=ConcurrencyMode.Single) 的。当服务实例调用客户端回调服务时,方法被阻塞,直到客户端回调服务消息返回(reply message)。而问题是,Single模式不允许重入调用(reentrant calls),即便系统获得返回消息,也会因为无法重入调用方法解除阻塞而造成死锁。了解了这些背景,要解决这个死锁也很简单。方法1: 将回调接口方法设置为 "IsOneWay=true",这样就无需处理客户端返回消息。为回调接口方法添加 IsOneWay。
public interface ICallBack{&&[OperationContract(IsOneWay=true)]&&void Execute(DateTime d);}修改客户端代理文件,添加 IsOneWay,删除 ReplyAction。
[GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]public interface IServiceCallback{&&[OperationContractAttribute(IsOneWay = true, Action = "http://.../IService/Execute")]&&void Execute(System.DateTime d);}方法2: 修改服务契约的并发模式,改为 "ConcurrencyMode.Reentrant" 或 "ConcurrencyMode.Multiple"。和方法1不同,本方法无需对客户端做出修改。
[Servicebehavīor(ConcurrencyMode=ConcurrencyMode.Reentrant)]public class MyService : IService, IDisposable{&&public void Test()&&{&&&&Console.WriteLine("Service Invoke CallBack...");&&&&OperationContext.Current.GetCallbackChannel&ICallBack&().Execute(DateTime.Now);&&}&&public void Dispose()&&{&&&&Console.WriteLine("Dispose:{0}", DateTime.Now);&&}}无论使用哪种方法,修改后再次运行,我们得到了应有的结果。回调机制可以用来实现类似事件通知等功能,但对于多数情况下,并不推荐使用。服务器要连接客户端实现回调,可能面临很多问题,诸如内部网络地址、防火墙等等,而且回调机制也让服务实例的生存期管理变得更复杂。1626人阅读
protected&void&btnRestart_Click(object&sender,&EventArgs&e)&{&ServiceController&sc&=&new&ServiceController(&&wuauserv&&);&sc.ServiceName&=&&localhost&&;&switch&(sc.Status)&{&case&ServiceControllerStatus.StopPending:&case&ServiceControllerStatus.Stopped:&sc.Refresh();&while&(sc.Status&!=&ServiceControllerStatus.Stopped)&{&sc.Refresh();&}&sc.Start();&break;&case&ServiceControllerStatus.StartPending:&case&ServiceControllerStatus.Running:&sc.Stop();&while&(sc.Status&!=&ServiceControllerStatus.Stopped)&{&sc.Refresh();&}&sc.Start();&break;&default:&sc.Start();&break;&}&}&}
网友回复:见:http://blog.csdn.net/zhoufoxcn/archive//1528824.aspx 在项目中,非凡是安装项目中我们经常要判定一些服务是否启动(判定SQL Server是否启动最常见),在.net中我们如何判定指定的Windows服务是否启动呢?首先要知道Windows服务的显示名称,这里以IIS检测为例,我们知道IIS的显示名称是&IIS Admin&,现在用下面的代码来判定IIS是否启动。
ServiceController[]&service=ServiceController.GetServices();&bool&isStart&=&false;&for&(int&i&=&<span style="COLOR: #;&i&&&service.L&i&)&{&if&(service[i].DisplayName.ToUpper().Equals(&IIS&Admin&.ToUpper()))&{&if&(service[i].Status&==&ServiceControllerStatus.Running)&{&isStart&=&true;&break;&}&}&}&if&(isStart)&{&MessageBox.Show(&服务已经启动&);&}&else&{&MessageBox.Show(&服务没启动&);&}&
在使用时别忘记导入System.ServiceProcess这个名称空间,一般情况下VS.net是不会自动导入的。 获取了ServiceController 实例之后就可以Stop()/Pause ()/Start ()了。网友回复:在下也按照楼上各位的方法去试了,但是却提示错误,比如我想启动Telnet,运行时却提示:用户代码未处理InvalidOperationException 无法启动计算机&.&上的服务 Telnet.请各位指教一下,谢谢!!网友回复:确实说的很不错。Mark下
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:116540次
积分:1938
积分:1938
排名:第9317名
原创:81篇
评论:39条
(1)(2)(7)(7)(41)(6)(25)用户代码未处理 System.Data.SqlClient.SqlException
用户代码未处理 System.Data.SqlClient.SqlException 15
using Susing System.Dusing System.Cusing System.Cusing System.Wusing System.Web.Susing System.Web.UI;using System.Web.UI.WebCusing System.Web.UI.WebControls.WebPusing System.Web.UI.HtmlCusing System.Data.SqlC
public partial class DataAdapter_update : System.Web.UI.Page{&&& protected void Page_Load(object sender, EventArgs e)&&& {
&&& }&&& protected void Button1_Click(object sender, EventArgs e)&&& {&&&&&&& string sqlconnstr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionS&&&&&&& SqlConnection sqlconn = new SqlConnection(sqlconnstr);&&&&&&& DataSet ds = new DataSet();&&&&&&& DataT&&&&&&& DataRowC&&&&&&& DataR&&&&&&& sqlconn.Open();&&&&&&& SqlDataAdapter sqld = new SqlDataAdapter("select* from student", sqlconn);&&&&&&& sqld.UpdateCommand = new SqlCommand("UNDATE student SET NAME=@NAME WHERE NO=@NO",sqlconn );&&&&&&& sqld.UpdateCommand.Parameters.Add("@NAME",SqlDbType.VarChar,50,"NAME");&&&&&&& SqlParameter parameter=sqld .UpdateCommand .Parameters .Add ("@NO",SqlDbType .Char& ,10);&&&&&&& parameter.SourceColumn="NO";&&&&&&& parameter .SourceVersion=DataRowVersion .O&&&&&&& sqld .Fill (ds,"tabstudent");&&&&&&& dtable =ds.Tables ["tabstudent"];&&&&&&& coldrow =dtable .R&&&&&&& for(int inti=0;inti&coldrow .Cinti ++)&&&&&&& {&&&&&&&&&&& drow =coldrow [inti];&&&&&&&&&&& drow [1]=drow [1]+"A";&&&&&&& }&&&&&&& sqld.Update(ds,"tabstudent");这一行出现题目所示的错误,该怎样修改?&&&&&&& sqlconn .Close ();&&&&&&& sqlconn =&&&&&&& Label1 .Text ="更新成功!";&&& }}
请检查一下连接字符串是否正确,请留下QQ方便联系
找不到哪里出了错误,你能帮我检查一下?谢谢
你的update语句错误,拼写成了undate,少了一个p。
其他回答 (1)
&#10;System.Data.SqlClient.SqlException:用户&opper\ASPNET&登录失败的解决办法:由于他的数据库连接语句中没有采用用户名和密码验证,采用的是windows集成验证,所以无法连接数据库。解决方法很简单,加上opper\ASPNET这个账号,赋予权限即可,具体方法如下:1、企业管理器--》安全性--》登陆--》(右键)新建登陆--》名称(在列表中添加ASPNET这个用户);2、然后在服务器角色一栏中选择SystemAdministrators;3、在数据库访问一栏中选择所要访问的数据库,然后在下面对话框中将db_owner选上,确定即可&#10;Tb_leaver_kind这个字段是否存在?&#10;&#10;&#9;
你能根据我上面的代码详细的分析一下吗?你给的答案我在网上也看到,但无法调解
相关知识等待您来回答
编程领域专家用户代码未处理 System.InvalidOperationException
[问题点数:0分,结帖人zhonglimh]
用户代码未处理 System.InvalidOperationException
[问题点数:0分,结帖人zhonglimh]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关帖子推荐:
本帖子已过去太久远了,不再提供回复功能。}

我要回帖

更多关于 exception 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信