Silverlight DataGrid更新问题

sinotrix2010 2010-07-28 09:39:29

远程服务器返回了意外响应: (400) Bad Request。在 Silverlight 中,即使服务发送其他错误代码,也可能会报告 404 响应代码。




public bool EndUpdate(out SilverlightApplication1.MyDataService.CustomException ServiceError, System.IAsyncResult result) {
object[] _args = new object[1];
bool _result = ((bool)(base.EndInvoke("Update", _args, result))); //~~~~~~这段报错~~~~~~~~~~~~~~~
ServiceError = ((SilverlightApplication1.MyDataService.CustomException)(_args[0]));
return _result;
}





当我要更新的表数据量比较小,字段比较少的时候,就不会出现这样的问题;当要更新的表字段多的时候,一行数据都更新不了,报上面的错。我的数据是在客户端转成了XML格式传给WCF端的。
...全文
648 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
pyfhua 2011-07-21
  • 打赏
  • 举报
回复
看看答案适用不
lshe05 2010-12-07
  • 打赏
  • 举报
回复
我也遇到同样的问题, 怎么解决呀?
Sunpire 2010-07-30
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 sinotrix2010 的回复:]
谢谢sunpire 了,好人啊。。。
[/Quote]

不客气,呵呵,也是一次经历,而且也见识到了那个加拿大的代码。
sinotrix2010 2010-07-30
  • 打赏
  • 举报
回复
谢谢sunpire 了,好人啊。。。
Sunpire 2010-07-29
  • 打赏
  • 举报
回复
LZ,对不起,是我错了,我太大意了。

我忘了检查你的WCF配置了:

<service name="BasicHttpBinding_IGetData">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IGetData" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>


这是正确的写法, LZ找到哪里不同了么?

<service name="WcfService1.GetData">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IGetData" contract="WcfService1.GetData" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>


就是 service.name 和 endpoint.contract 。 以前小康同学总结时我还说他没有把这几点关键总结出来,呵呵,想不到自己也这么大意。

实在是太大意了。

把这个接收数据太大而出现的异常也抓了下来了:
格式化程序尝试对消息反序列化时引发异常: 尝试对参数 进行反序列化时出错: d。InnerException 消息是“反序列化对象 属于类型 WcfService1.DataSetData 时出现错误。读取 XML 数据时,超出最大字符串内容长度配额 (8192)。通过更改在创建 XML 读取器时所使用的 XmlDictionaryReaderQuotas 对象的 MaxStringContentLength 属性,可增加此配额。 行 245,位置 32。”。有关详细信息,请参见 InnerException。


另外再说一下,最好是把那 WcfService1 放到一个单独的解决方案中,这样才可以在 WcfService1 中的代码设置断点。
sinotrix2010 2010-07-29
  • 打赏
  • 举报
回复
已发到你邮箱了。。。麻烦啦。。
Sunpire 2010-07-29
  • 打赏
  • 举报
回复
sunpire@qq.com 今晚帮你试下
sinotrix2010 2010-07-29
  • 打赏
  • 举报
回复
好的。。谢谢。。能否把你的邮箱发给我 。。我把那个例子发过去。。。
Sunpire 2010-07-29
  • 打赏
  • 举报
回复
我说错了,WcfService1 貌似是WCF项目,会自启动的, 端口号是 1338 ,和 SilverlightApplication1.Web 确实是没有关系的。

是要修改 WcfService1 中的 Web.config 的。

看来我只能连接数据库试试了。
Sunpire 2010-07-29
  • 打赏
  • 举报
回复
LZ ,你的这个例子就是传说中的 加拿大的在Silverlight+WCF中传输DataTable 的方法吧,呵呵原来它也是用的 Reflection 的,和我用的基本上是相同的,赞一下自己先。

分析了一下,解决方案中有一个 WcfService1 项目,WCF服务也在这里,
可是在解决方案运行时, Web 项目是 SilverlightApplication1.Web ,这也就说 Web.config 起作用的是 SilverlightApplication1.Web 中的 Web.config ,
不是 WcfService1 中的 Web.config 。

楼主先试一下修改 SilverlightApplication1.Web 中的 Web.config 吧。


奇怪的是 WcfService1 和 SilverlightApplication1.Web 的关系我没搞明白,研究中。
一般的做法是会把 WcfService1 放在另一个ASP.NET解决方案中的,没见过这样子的。
Sunpire 2010-07-29
  • 打赏
  • 举报
回复
10KB都不到就出错,那有点杯具啊。 要是在12KB才出错,那还能认为是那个WCF接收最大值导致的问题,看来是另有问题了。

能不能做出一个同等的模型出来(或者从你的解决方案中删除其他全部用不到的东西),帮你测试一下。
sinotrix2010 2010-07-29
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 sunpire 的回复:]
我在10说的Xml文件大小的临界值大致确定了么
[/Quote]


取出来保存为.XML看了下。。。10KB不到。。
Sunpire 2010-07-29
  • 打赏
  • 举报
回复
我在10说的Xml文件大小的临界值大致确定了么
sinotrix2010 2010-07-29
  • 打赏
  • 举报
回复
....谁知道 。。。我这问题是哪出错了。。。?
Sunpire 2010-07-28
  • 打赏
  • 举报
回复
可以这样理解吧, WCF端发送数据,默认最大值为4MB,而接收数据,默认最大值为16KB。
Sunpire 2010-07-28
  • 打赏
  • 举报
回复
我给出的配置是 customBinding 的,楼主用的是basicHttpBinding的,配置上也许有些不同,在VS2010中配置语法不对时会给出提示的,如果运行正确,那就OK了。

[Quote=引用 4 楼 sinotrix2010 的回复:]
还有个问题使我不解的就是,为什么查询的时候,取大量数据都没问题,更新的时候就不行了??
[/Quote]
这个很好理解嘛,WCF的这几个配置值貌似多数是配置的接收的,并不是发送的配置。
而Silverlight在自动生成的代理中,其默认接收配置也全是2GB的最大值,这在 ServiceReferences.ClientConfig 中可以看得到。

查询时对于WCF端是发送数据,对于Silverlight端是接收数据嘛。

但是,查询的数据达到 4MB 时,一般10000条记录时多数也会出现 Not Found 的错误的,这个记录数视传送的单个数据序列化后Xml的大小而不同,楼主不妨试一下。
sinotrix2010 2010-07-28
  • 打赏
  • 举报
回复
还有个问题使我不解的就是,为什么查询的时候,取大量数据都没问题,更新的时候就不行了??
sinotrix2010 2010-07-28
  • 打赏
  • 举报
回复
WCF 配置文件如下:
麻烦帮忙看看




<?xml version="1.0" encoding="utf-8"?>
<configuration>

<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<!--<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>-->
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IGetData" maxBufferPoolSize="2147483647" closeTimeout="00:10:00" openTimeout="00:10:00" sendTimeout="00:10:00" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">
<readerQuotas maxDepth="2147483647"
maxStringContentLength="2147483647"
maxArrayLength="2147483647"
maxBytesPerRead="2147483647"
maxNameTableCharCount="2147483647"/>
</binding>
</basicHttpBinding>
</bindings>

<services>
<service name="BasicHttpBinding_IGetData">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IGetData" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>

<behaviors>
<serviceBehaviors>
<behavior>
<serviceTimeouts transactionTimeout="00:10:00"/>
<dataContractSerializer maxItemsInObjectGraph="2147483647"/>
<!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false 并删除上面的元数据终结点 -->
<serviceMetadata httpGetEnabled="true"/>
<!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息 -->
<serviceDebug includeExceptionDetailInFaults="false"/>
<serviceThrottling maxConcurrentCalls="1000000" maxConcurrentSessions="1000000" maxConcurrentInstances="1000000"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>

<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>

</configuration>
Sunpire 2010-07-28
  • 打赏
  • 举报
回复
WCF端设置一下就可以了,但是在 IIS的默认模式下,默认最大值为 4MB,虽说WCF可以设置为 2GB。

WCF端设置(最大值的例子)

<binding name="customBinding0">
<binaryMessageEncoding maxReadPoolSize="2147483647" maxWritePoolSize="2147483647"
maxSessionSize="2147483647">
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
</binaryMessageEncoding>
<httpTransport maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
keepAliveEnabled="true" maxBufferSize="2147483647" transferMode="Streamed" />
</binding>


WCF 的默认最大值是16KB,上面给的例子是2GB。
如果要突破IIS默认的4MB的限制,
还需要在System.Web节下加上 <httpRuntimemaxRequestLength="102400" /> 这里的单位是KB,这里表示100MB。

但是在提交数据至WCF端时,并不建议去更改这个默认的4MB,而是建议对数据进行压缩(在Silverlight端先序列化得到xml,然后压缩这个xml,传至WCF端进行反向过程的操作)。
LT_Friends 2010-07-28
  • 打赏
  • 举报
回复
这段代码是自动生成的,看这没有用吧,要看你的web service端的实际代码。可以射个断点看看数据有没有正确的取到,还是像你说的数据多超过最大流量了,或者是连接服务器延迟问题
加载更多回复(5)

8,736

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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