WCF套接字连接已释放

kinglshadow 2010-03-28 09:14:51
最近在用WCF做后台发布信息的功能,但是在发布图片的时候出现了这样的异常。但是图片大小在30K左右的时候这样的异常就不会发生,测试过70K的图片文件都会发生这样的异常,由于使用的是Winform做后台,使用的是RichTextBox编辑内容,但是将图片保存入数据却没有问题,一旦读取就会出问题.以下是我的WCF配置文件和发送图片获取图片代码。
麻烦高人指点下。

#region 获取数据以保存入数据库
byte[] bWrite = System.Text.Encoding.Default.GetBytes(this.rtbContent.Rtf); //rtbContent是RichTextBox
InfoCenterModel model = new InfoCenterModel();
model.Author = AccountNo;
model.Title = txtTitle.Text;
model.BigType = cboMEA.Text.Trim();
model.SmallType = cboTypeDetail.Text.Trim();
model.Content = bWrite;
model.Sourse = txtSourse.Text.Trim();

m_proxy.AddInfo(model);

#endregion



#region 读取数据以显示
DataTable dt = null ;
dt = m_proxy.QueryInfo();


byte[] b = (byte[])dt.Rows[0]["Content"];

string s = System.Text.Encoding.Default.GetString(b, 0, b.Length);
this.rtbContent.Rtf = @s;
#endregion
...全文
617 24 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
xewnwsl2001 2011-05-19
  • 打赏
  • 举报
回复
这个问题是由于你服务端的代码问题,
服务端获取到的数据量太大,造成WCF在反序列化的过程中几乎处于死循环。你可以看下,服务端的数据量是不是很大。减少一点数据量就可以了。
kinglshadow 2010-03-31
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 qldsrx 的回复:]
改一下你的客户端配置文件中的maxBytesPerRead="4096"呢?这个和服务端不一致,虽然不敢保证是否有效,不过可以尝试下。
[/Quote]
改了,又出现以下异常:
CLR 无法从 COM 上下文 0x3ca9f8 转换为 COM 上下文 0x3cab68,这种状态已持续 60 秒。拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Windows 消息的情况下处理一个运行时间非常长的操作。这种情况通常会影响到性能,甚至可能导致应用程序不响应或者使用的内存随时间不断累积。要避免此问题,所有单线程单元(STA)线程都应使用泵式等待基元(如 CoWaitForMultipleHandles),并在运行时间很长的操作过程中定期发送消息。
qldsrx 2010-03-31
  • 打赏
  • 举报
回复
改一下你的客户端配置文件中的maxBytesPerRead="4096"呢?这个和服务端不一致,虽然不敢保证是否有效,不过可以尝试下。
kinglshadow 2010-03-30
  • 打赏
  • 举报
回复
青龙白虎 人呢
kinglshadow 2010-03-29
  • 打赏
  • 举报
回复
在线等,还是没找到问题。
kinglshadow 2010-03-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sp1234 的回复:]
C# code
m_proxy.QueryInfo();
这是什么呢?

你贴的代码跟问题一点关系都没有,贴那么多没用。
[/Quote]
那主要是查询数据的
string Sqlstring = "select top 1 Id,Title,Author,Content,ReleaseTime from infocenter order by ReleaseTime Desc ";
return SQLHelper.QueryReturnTable(connectionString, Sqlstring).Tables[0];
  • 打赏
  • 举报
回复
通常,这是因为在服务器端存在非常严重的、造成进程崩溃的异常,服务器直接关闭了连接(而无法传递异常信息给客户端)。

如果你仅用vs来开发,那是很不够的。调试时你在客户端看不到服务器端都出现了什么重大问题。.net的WCF配有专门的服务器调试工具,可以记录服务器端的异常信息,例如SvcTraceViewer等等。
  • 打赏
  • 举报
回复
m_proxy.QueryInfo();
这是什么呢?

你贴的代码跟问题一点关系都没有,贴那么多没用。
kinglshadow 2010-03-29
  • 打赏
  • 举报
回复
等了一夜了还是未果!
kinglshadow 2010-03-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wmpkumse 的回复:]
会不会是网络原因呢?
[/Quote]
我都是内网测试的,将大文件保存入数据库速度都比较快,就是从数据库获取显示在richtextbox时,文件过大会报标题的异常
wmpkumse 2010-03-29
  • 打赏
  • 举报
回复
会不会是网络原因呢?
kinglshadow 2010-03-29
  • 打赏
  • 举报
回复 1
期待高手的解答
kinglshadow 2010-03-29
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 qldsrx 的回复:]
引用 18 楼 kinglshadow 的回复:
m_proxy是客户端代理,主要是调用远程服务,这里主要是对远程机器数据库进行插入与读取

你的配置文件没什么问题,就算有问题,错误信息也不是那样的,所以要检查m_proxy的实现过程。
你不公开那部分代码的话,我只能给点建议性的方案,检查下数据读取是否是按照对象读取的,有可能是手动组装的对象,以Byte[]方式序列化后传输,那么就有可能在……
[/Quote]


m_proxy.QueryInfo()

QueryInfo()
{
string Sqlstring = "select top 1 Id,Title,Author,Content,ReleaseTime from infocenter order by ReleaseTime Desc ";
return SQLHelper.QueryReturnTable(connectionString, Sqlstring).Tables[0];
}


客户端代理

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[System.ServiceModel.ServiceContractAttribute(Namespace = "http://SunkeSoft.Com.SunkeTrader/2010/01", ConfigurationName = "DataExchangeContract")]
public interface DataExchangeContract
{
[System.ServiceModel.OperationContractAttribute(Action = "http://SunkeSoft.Com.SunkeTrader/2010/01/DataExchangeContract/QueryInfo", ReplyAction = "http://SunkeSoft.Com.SunkeTrader/2010/01/DataExchangeContract/QueryInfoResponse")]
DataTable QueryInfo();




实现接口:


[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public partial class DataExchangeContractClient : System.ServiceModel.ClientBase<DataExchangeContract>, DataExchangeContract
{

public DataExchangeContractClient()
{
}

public DataExchangeContractClient(string endpointConfigurationName) :
base(endpointConfigurationName)
{
}

public DataExchangeContractClient(string endpointConfigurationName, string remoteAddress) :
base(endpointConfigurationName, remoteAddress)
{
}

public DataExchangeContractClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) :
base(endpointConfigurationName, remoteAddress)
{
}

public DataExchangeContractClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) :
base(binding, remoteAddress)
{
}
public DataTable QueryInfo()
{
return base.Channel.QueryInfo();
}



qldsrx 2010-03-29
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 kinglshadow 的回复:]
m_proxy是客户端代理,主要是调用远程服务,这里主要是对远程机器数据库进行插入与读取
[/Quote]
你的配置文件没什么问题,就算有问题,错误信息也不是那样的,所以要检查m_proxy的实现过程。
你不公开那部分代码的话,我只能给点建议性的方案,检查下数据读取是否是按照对象读取的,有可能是手动组装的对象,以Byte[]方式序列化后传输,那么就有可能在数据尚未完整接收就反序列化。按理说使用微软自己的方法序列化传输是不会有这种奇怪的错误提示的。
kinglshadow 2010-03-29
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 qldsrx 的回复:]
m_proxy是什么类型的对象,它的那些方法都做了什么?
[/Quote]
m_proxy是客户端代理,主要是调用远程服务,这里主要是对远程机器数据库进行插入与读取
qldsrx 2010-03-29
  • 打赏
  • 举报
回复
m_proxy是什么类型的对象,它的那些方法都做了什么?
kinglshadow 2010-03-29
  • 打赏
  • 举报
回复
又有新问题了。我将配置文件的transferMode="Streamed" 改为transferMode="Buffered" 读取文件大小 最大可以读取到约3MB的文件,一旦文件超过这个大小,就会出校OutOfMemory错误。
kinglshadow 2010-03-29
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 weixuan1122 的回复:]
或许懂了
[/Quote]
什么问题?
weixuan1122 2010-03-29
  • 打赏
  • 举报
回复
或许懂了
kinglshadow 2010-03-29
  • 打赏
  • 举报
回复
刚又测试了,存储大于4MB的图片都没问题,但是读取几十KB的文件都会报标题的错误!
加载更多回复(4)

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧