none
wcf 操纵数据库更新 RRS feed

  • 问题

  • 我在使用WCF 往数据库里保存数据时,数据库里定义了一个字段为XML类型,当数据保存少的时候没有问题都正常,数据大的时候就一直报错,请大家指教下如何解决,都弄了2天没解决掉!!

    代码:
      EndpointAddress address = new EndpointAddress(new Uri(Application.Current.Host.Source, "/Services/GetDataEntityService.svc"));
                    Shareidea.Web.UI.Control.Workflow.Designer.ConfigService.GetDataEntityServiceClient client = new Shareidea.Web.UI.Control.Workflow.Designer.ConfigService.GetDataEntityServiceClient(new BasicHttpBinding(), address);
                    client.SaveFlowConfigCompleted += new EventHandler<Shareidea.Web.UI.Control.Workflow.Designer.ConfigService.SaveFlowConfigCompletedEventArgs>(client_SaveFlowConfigCompleted);
                    client.SaveFlowConfigAsync(item);


     void client_SaveFlowConfigCompleted(object sender, Shareidea.Web.UI.Control.Workflow.Designer.ConfigService.SaveFlowConfigCompletedEventArgs e)
            {
                if (e.Result)
                {
                    System.Windows.Browser.HtmlPage.Window.Alert("保存成功!");
                }
                else
                {
                    System.Windows.Browser.HtmlPage.Window.Alert("保存失败!");
                }
            }



    异常:
    {System.Net.WebException: 远程服务器返回了错误: NotFound。
       位于 System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult)
       位于 System.Net.Browser.BrowserHttpWebRequest.<>c__DisplayClass5.<EndGetResponse>b__4(Object sendState)
       位于 System.Net.Browser.AsyncHelper.<>c__DisplayClass2.<BeginOnUI>b__0(Object sendState)}


    WCF  web.config配置:
     <system.serviceModel>
        <bindings>
          <basicHttpBinding>
            <binding name="BasicHttpBinding_IDataService" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" textEncoding="UTF-8" sendTimeout="00:05:10" receiveTimeout="00:05:10" openTimeout="00:05:10" closeTimeout="00:05:10">
              <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
            </binding>
          </basicHttpBinding>
        </bindings>
        <behaviors>
          <serviceBehaviors>
            <behavior name="ShareDesigner.Web.Services.ModelStateBehavior">
              <serviceMetadata httpGetEnabled="true"  />
              <serviceDebug includeExceptionDetailInFaults="false" />
            </behavior>
            <behavior name="ShareDesigner.Web.GetDataEntityBehavior">
              <serviceTimeouts transactionTimeout="00:30:00" />
              <serviceMetadata httpGetEnabled="true" />
              <serviceDebug includeExceptionDetailInFaults="false" />
            </behavior>
            <behavior name="ShareDesigner.Web.Services.GetDataEntityServiceBehavior">
              <serviceMetadata httpGetEnabled="true" />
              <serviceDebug includeExceptionDetailInFaults="false" />
            </behavior>
          </serviceBehaviors>
        </behaviors>
        <services>
          <service behaviorConfiguration="ShareDesigner.Web.Services.ModelStateBehavior"
            name="ShareDesigner.Web.Services.ModelState" >
            <endpoint address="" binding="basicHttpBinding" contract="ShareDesigner.Web.WorkStateCfg"  />
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"  />


          </service>
          <service behaviorConfiguration="ShareDesigner.Web.GetDataEntityBehavior"
            name="ShareDesigner.Web.GetDataEntity">
            <endpoint address="" binding="basicHttpBinding" contract="ShareDesigner.Web.IGetDataEntity" >
              <identity>
                <dns value="localhost" />
              </identity>
            </endpoint>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
          </service>
          <service behaviorConfiguration="ShareDesigner.Web.Services.GetDataEntityServiceBehavior"
            name="ShareDesigner.Web.Services.GetDataEntityService">
            <endpoint address="" binding="basicHttpBinding"  contract="ShareDesigner.Web.Services.IGetDataEntityService">
              <identity>
                <dns value="localhost" />
              </identity>
            </endpoint>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
          </service>
        </services>
      </system.serviceModel>
    </configuration>

    • 已编辑 msabc 2010年2月1日 5:27
    2010年1月31日 14:26

答案

  • 若是上传大数据,你应该修改service端的Quotas设置,也就是web.config文件

            <basicHttpBinding >
              <binding name="bb1" MaxReceivedMessageSize="1000000">
                <readerQuotas maxStringContentLength="100000"/>
              </binding>
            </basicHttpBinding>

    此外,在检查一下是否要修改MaxReceivedMessageSize


    Mog Liang
    2010年2月4日 1:56

全部回复

  • 你能不能使用trace log来跟踪一下信息

    这个错误信息很少啊
    不好推断


    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2010年2月2日 4:36
    版主
  • 你的客户端是Silverlight吧。在服务端把这个选项打开,这样能获得更多异常信息。

    <

     

     

     

     

     serviceDebug includeExceptionDetailInFaults="true" />


    Mog Liang
    2010年2月2日 8:56
  • trace log跟踪的结果是这样:


    格式化程序尝试对消息反序列化时引发异常: 尝试对参数 http://tempuri.org/ 进行反序列化时出错: item。InnerException 消息是“反序列化对象 属于类型 ShareDesigner.Web.Model.FlowConfig 时出现错误。读取 XML 数据时,超出最大字符串内容长度配额 (8192)。通过更改在创建 XML 读取器时所使用的 XmlDictionaryReaderQuotas 对象的 MaxStringContentLength 属性,可增加此配额。 第 41 行,位置为 507。”。有关详细信息,请参阅 InnerException。


    可是我的配置文件里已经改了很大了啊,
    <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>


    还需要在哪改呢
    2010年2月2日 16:10
  • 网上搜了结果是说在web.config 和app.config里修改maxStringContentLength 为一个较大的值,

    可是我只有ServiceReferences.ClientConfig和web.config没有app.config ,

    且web.config里已经是最大了还是不行,没找到app.config,

    但ServiceReferences.ClientConfig是系统自动生成的配置文件,他的内容如下:

    (添加readerQuotas不能识别,)

    <configuration>
        <system.serviceModel>
            <bindings>
                <basicHttpBinding>
                    <binding name="WorkFlowSoap" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">
                        <security mode="None" />
                    </binding>
                    <binding name="BasicHttpBinding_IGetDataEntityService" maxBufferSize="2147483647"
                        maxReceivedMessageSize="2147483647">
                     <readerQuotas maxStringContentLength="2147483647">---此处不能识别该节点

                      <security mode="None" />
                    </binding>
                </basicHttpBinding>
            </bindings>
            <client>
                <endpoint address="http://localhost:4946/services/workflow.asmx"
                    binding="basicHttpBinding" bindingConfiguration="WorkFlowSoap"
                    contract="ServicesClient.WorkFlowSoap" name="WorkFlowSoap" />
                <endpoint address="http://localhost:4946/Services/GetDataEntityService.svc"
                    binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IGetDataEntityService"
                    contract="ConfigService.IGetDataEntityService" name="BasicHttpBinding_IGetDataEntityService" />
            </client>
        </system.serviceModel>
    </configuration>

    2010年2月2日 16:37
  • 这个错误是不是WCF服务端抛出的?

    你上传了大的数据?
    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2010年2月3日 1:06
    版主
  • 是的,我是把一个大的字符串(配置文件)保存到数据库的XML数据表里,可能会超过8K
    2010年2月3日 1:54
  • 他内部异步结束的时候报的,这里:

                public bool EndSaveFlowConfig(System.IAsyncResult result) {
                    object[] _args = new object[0];
                    bool _result = ((bool)(base.EndInvoke("SaveFlowConfig", _args, result)));
                    return _result;
                }
               
    2010年2月3日 1:58
  • 我是在SilverLight里调用的WCF

    2010年2月3日 16:35
  • 若是上传大数据,你应该修改service端的Quotas设置,也就是web.config文件

            <basicHttpBinding >
              <binding name="bb1" MaxReceivedMessageSize="1000000">
                <readerQuotas maxStringContentLength="100000"/>
              </binding>
            </basicHttpBinding>

    此外,在检查一下是否要修改MaxReceivedMessageSize


    Mog Liang
    2010年2月4日 1:56
  • 我这里的是Silverlight.客户端配置文件时ServiceReferences.ClientConfig
    <configuration>
        <system.serviceModel>
            <bindings>
                <basicHttpBinding>
                    <binding name="WorkFlowSoap" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">
                        <security mode="None" />
                    </binding>
                    <binding name="BasicHttpBinding_IGetDataEntityService" maxBufferSize="2147483647"
                        maxReceivedMessageSize="2147483647">
                     <readerQuotas maxStringContentLength="2147483647">---此处不能识别该节点

                      <security mode="None" />
                    </binding>
                </basicHttpBinding>
            </bindings>
        </system.serviceModel>
    </configuration>


    问题在哪呢??

    服务端 web.config配置:
     <system.serviceModel>
        <bindings>
          <basicHttpBinding>
            <binding name="BasicHttpBinding_IDataService" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" textEncoding="UTF-8" sendTimeout="00:05:10" receiveTimeout="00:05:10" openTimeout="00:05:10" closeTimeout="00:05:10">
              <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
            </binding>
          </basicHttpBinding>
        </bindings>
        <behaviors>

    2010年2月4日 4:10
  • silverlight 端binding没有quota 相关属性,你把readerQuotas节删掉吧。把服务器端binding配置好,记得把binding实施到endpoint上

    <endpoint address="" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IDataService" contract="......">
    Mog Liang
    2010年2月4日 5:41
  • 这个数据也太大了吧,这么做合适马,是不是该分片呢
    2010年2月6日 13:17
  • 8k不算大啊
    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2010年2月6日 14:17
    版主