前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >学会WCF之试错法——数据传输

学会WCF之试错法——数据传输

作者头像
甜橙很酸
发布于 2018-03-08 03:44:32
发布于 2018-03-08 03:44:32
89200
代码可运行
举报
文章被收录于专栏:DOTNETDOTNET
运行总次数:0
代码可运行

服务契约

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[ServiceContract]
    public interface IService
    {
        [OperationContract]
        string GetData(int value);

        [OperationContract]
        string GetString(string value);

        [OperationContract]
        void Upload(Request request);
    }

    [MessageContract]
    public class Request
    {
        [MessageHeader(MustUnderstand = true)]
        public string FileName { get; set; }

        [MessageBodyMember(Order = 1)]
        public Stream Content {get;set;}
}

服务

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Reentrant)]
    public class Service : IService
    {
        public string GetData(int value)
        {
            //Thread.Sleep(120000);
            return string.Format("You entered: {0}", value);
        }

        public string GetString(string value)
        {
            //Thread.Sleep(120000);
            return string.Format("You entered: {0}", value);
        }

        public void Upload(Request request)
        {
            try
            {
                StreamReader sr = new StreamReader(request.Content, Encoding.GetEncoding("GB2312"));
                StreamWriter sw = new StreamWriter("E:\\" + request.FileName + ".txt", false, Encoding.GetEncoding("GB2312"));
                while (!sr.EndOfStream)
                {
                    sw.WriteLine(sr.ReadLine());
                    //Thread.Sleep(5000);
                }
                sr.Close();
                sw.Close();
            }
            catch (Exception ex)
            { }
            
        }
}

服务配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<system.serviceModel>
    <services>
      <service name="WCF_Find_Error_Lib.Service">
        <endpoint address="" binding="basicHttpBinding" contract="WCF_Find_Error_Lib.IService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost/S" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="True" httpsGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

客户端代理

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ServiceProxy
    {
        public string GetData(int value)
        {
            string ret = null;
            ServiceClient client = null;
            try
            {
                client = new ServiceClient();
                ret = client.GetData(value);
                client.Close();
            }
            catch
            {
                if (client != null)
                {
                    client.Abort();
                }
                throw;
            }
            return ret;
        }

        public string GetString(string value)
        {
            string ret = null;
            ServiceClient client = null;
            try
            {
                client = new ServiceClient();
                ret = client.GetString(value);
                client.Close();
            }
            catch
            {
                if (client != null)
                {
                    client.Abort();
                }
                throw;
            }
            return ret;
        }
        public void Upload(Request request)
        {
            ServiceClient client = null;
            try
            {
                client = new ServiceClient();
                client.Upload(request);
                client.Close();
            }
            catch
            {
                if (client != null)
                {
                    client.Abort();
                }
                throw;
            }
        }

    }


    [ServiceContractAttribute(ConfigurationName = "IService")]
    public interface IService
    {

        [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IService/GetData", ReplyAction = "http://tempuri.org/IService/GetDataResponse")]
        string GetData(int value);

        [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IService/GetString", ReplyAction = "http://tempuri.org/IService/GetStringResponse")]
        string GetString(string value);

        [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IService/Upload", ReplyAction = "http://tempuri.org/IService/UploadResponse")]
        void Upload(Request request);
    }
    [MessageContract]
    public class Request
    {
        [MessageHeader(MustUnderstand = true)]
        public string FileName { get; set; }

        [MessageBodyMember(Order = 1)]
        public Stream Content { get; set; }
}
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Reentrant)]
    public class ServiceClient : System.ServiceModel.ClientBase<IService>, IService
    {

        public ServiceClient()
        {
        }

        public string GetData(int value)
        {
            return base.Channel.GetData(value);
        }

        public string GetString(string value)
        {
            return base.Channel.GetString(value);
        }

        public void Upload(Request request) 
        {
            base.Channel.Upload(request);
        }
}

客户端配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_IService" />
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://localhost/S" binding="basicHttpBinding"
          bindingConfiguration="BasicHttpBinding_IService" contract="IService"
          name="BasicHttpBinding_IService" />
    </client>
  </system.serviceModel>

配置参数:

MaxBufferPoolSize :从通道接收消息的消息缓冲区管理器分配并供其使用的最大内存量,BasicHttpBinding.MaxBufferPoolSize默认值为 524288 个字节。WSHttpBindingBase.MaxBufferPoolSize默认值为 65,536个字节,配置它可提高性能。

MaxBufferSize :从通道接收消息的缓冲区最大大小,默认值为 65,536 个字节。

MaxReceivedMessageSize:此绑定配置的通道上接收的消息的最大值,默认值为 65,536 个字节。

TransferMode:指示是通过缓冲处理还是流处理来发送消息

默认情况下,HTTP、TCP/IP 和命名管道传输协议使用缓冲消息传输。

XmlDictionaryReaderQuotas.MaxStringContentLength:读取器返回最大字符串长度,默认为8192

1 文件编码引起的错误

问题描述:

客户端向服务端传输数据时,假如是一个文本文件,接口参数是Stream,那么服务端使用StreamReader或StreamWrite时,不指定编码,服务运行在win7 及更新的操作系统上,默认的编码方式为Unicode,如果文本文件含义中文,那么服务端接收的内容出现乱码。而且服务端接收到的文件大小大于客户端传输的文件大小。

服务端配置

绑定配置如下,其他不变

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_IService" maxBufferSize="170000"/>
      </basicHttpBinding>
</bindings>

启动服务,报错,可见单独配置maxBufferSize是不行的。

修改配置如下,可正常运行:

服务端

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_IService" maxBufferSize="170000" maxReceivedMessageSize="170000"/>
      </basicHttpBinding>
</bindings>

客户端配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_IService" sendTimeout="00:00:10" />
      </basicHttpBinding>
</bindings>

调用接口

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
            try
            {
                ServiceProxy proxy = new ServiceProxy();
                //string s = proxy.GetData(1);
                //Console.WriteLine(s);
                Request r = new Request 
                {
                    Content = new FileStream("D:\\CSBMTEMP.txt", FileMode.Open),
                    FileName = "CSBMTEMP"
                };
                proxy.Upload(r);
                Console.Read();
            }
            //catch (CommunicationException ex)
            //{
 
            //}
            catch (Exception ex)
            {

            }

异常信息:

首先检查文件的大小,发现文件大小没有超过配置的最大值

将服务端配置按如下修改,也就是增大maxBufferSize和maxReceivedMessageSize的值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_IService" maxBufferSize="1700000" maxReceivedMessageSize="1700000">
        </binding>
      </basicHttpBinding>
</bindings>

运行客户端程序,发现服务端接收到文件为338K,远大于客户端上传文件大小,打开文件,看到乱码。

解决方法

将服务端Upload方法修改一下:

StreamReader sr = new StreamReader(request.Content,Encoding.Default);

StreamWriter sw = new StreamWriter("E:\\" + request.FileName + ".txt", false, Encoding.Default);

上面那两行代码添加编码方式为Encoding.Default,或者使用Encoding.GetEncoding("GB2312")这种编码方式。使用后者更好,因为明确地指出编码方式。

启动服务,运行客户端上传文件,成功且无乱码。文件大小也和客户端上传的相同。

2 maxBufferSize与maxReceivedMessageSize的设置

上面服务端maxBufferSize和maxReceivedMessageSize设置为1700000,远大于所传文件大小,那么将其改为167936会如何呢?

修改上面两个参数为167936,运行程序。结果报错:

那么,难道上传文件的数据会比这个大吗?是的,这只是消息的一部分内容。从客户端本地CLR类型来看,其传递的参数是一个对象:Request,它包含了两字段,Stream类型的Content和string类型的FileName。但这只是其中一部分原因。

经测试,若maxBufferSize和maxReceivedMessageSize设置为大于上传文件的二倍时,上传成功。由于默认采用缓冲处理模式(TransferMode .Buffered),缓冲处理是将消息全部缓存下来以后才对消息进行处理,猜想,缓存消息所需空间,加上处理消息也需要空间,那么两者的和就是二倍的传入消息大小。

若换成流传输模式(客户端不使用流模式,很奇怪的测试,不过依然通过)

服务端配置变为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<basicHttpBinding>
        <binding name="BasicHttpBinding_IService" transferMode="Streamed"/>
 </basicHttpBinding>

客户端配置不变,即:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_IService" sendTimeout="00:00:10" />
      </basicHttpBinding>
</bindings>

客户端调用接口,服务端报错。

客户端配置不变,服务端配置变为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<basicHttpBinding>
        <binding name="BasicHttpBinding_IService" maxBufferSize="170000" maxReceivedMessageSize="170000" transferMode="Streamed">
        </binding>
 </basicHttpBinding>

客户端调用接口,正常将文件传输到服务器

再次将服务端maxBufferSize和maxReceivedMessageSize修改为小于文件长度:150000,调用接口,可正常传输文件,但是只上传了文件的一半左右。继续将maxBufferSize和maxReceivedMessageSize调小为1000000,发现只上传了8K左右。结论是:当maxBufferSize和maxReceivedMessageSize设置小于消息大小的时候,程序正常运行,但是服务端无法接收客户端上传的全部数据。然而,如何准确地估计消息大小是个难题。最稳妥的办法是将上面那两个参数配置为消息体的最大值的二倍,另外从客户端设置上传消息的大小很多时候也是必要的。

将绑定换成netTcpBinding

服务端配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<bindings>
  <netTcpBinding>
        <binding name="NetTcpBinding_IService" maxBufferSize="17936" maxReceivedMessageSize="17936"/>
    </netTcpBinding>
</bindings>

显然maxBufferSize和maxReceivedMessageSize设置小于客户端发送的消息大小

采用默认的缓冲机制而并非流机制

客户端捕获异常:

从上面的异常中看不出是什么原因造成的,不过看下_remoteStackTraceString:

Server stack trace:

在 System.ServiceModel.Channels.StreamConnection.Read(Byte[] buffer, Int32 offset, Int32 size, TimeSpan timeout)

在 System.ServiceModel.Channels.SessionConnectionReader.Receive(TimeSpan timeout)

在 System.ServiceModel.Channels.SynchronizedMessageSource.Receive(TimeSpan timeout)

在 System.ServiceModel.Channels.TransportDuplexSessionChannel.Receive(TimeSpan timeout)

在 System.ServiceModel.Channels.TransportDuplexSessionChannel.TryReceive(TimeSpan timeout, Message& message)

在 System.ServiceModel.Dispatcher.DuplexChannelBinder.Request(Message message, TimeSpan timeout)

在 System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)

在 System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)

在 System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

Exception rethrown at [0]:

从上面StreamConnection.Read,SessionConnectionReader.Receive大概猜测是maxBufferSize和maxReceivedMessageSize设置引起的,由于套接字连接终止,在服务端无法捕获这类异常。将参数调大就没有这个问题了,数据可正常上传。

那么采用netTcpBinding是比较安全的,因为一旦设置的过小,会抛异常而不会出现数据不完整(只上传一部分)的情况。

当数据传输过程中服务关闭或网络中断抛异常:

貌似与maxBufferSize和maxReceivedMessageSize这两个参数设置不正确所抛异常一样,而且_remoteStackTraceString也与其一样,真是让人迷惑啊!!!

绑定配置变换为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<netTcpBinding>
        <binding name="NetTcpBinding_IService" maxBufferSize="79360" maxReceivedMessageSize="79360" transferMode="Streamed"/>
</netTcpBinding>

客户端配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<netTcpBinding>
        <binding name="NetTcpBinding_IService" sendTimeout="00:00:10"/>
</netTcpBinding>

客户端调用报错

修改客户端配置为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<netTcpBinding>
        <binding name="NetTcpBinding_IService" sendTimeout="00:00:10" transferMode="Streamed"/>
</netTcpBinding>

这次是由于maxBufferSize和maxReceivedMessageSize这两个参数设置小了的原因。

3 对于字符串传输的限制

服务端配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<bindings>
<basicHttpBinding>
        <binding name="BasicHttpBinding_IService" maxBufferSize="220000" maxReceivedMessageSize="220000" transferMode="Streamed">
        </binding>
      </basicHttpBinding>
</bindings>
<services>
<service name="WCF_Find_Error_Lib.Service">
<endpoint address="" 
                  binding="basicHttpBinding"
                  contract="WCF_Find_Error_Lib.IService" 
                  bindingConfiguration="BasicHttpBinding_IService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost/S" />
          </baseAddresses>
        </host>
      </service>
</services>

客户端配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_IService" sendTimeout="00:00:10"/>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://localhost/S" binding="basicHttpBinding"
          bindingConfiguration="BasicHttpBinding_IService" contract="IService"
          name="BasicHttpBinding_IService" />
    </client>
  </system.serviceModel>

客户端调用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ServiceProxy proxy = new ServiceProxy();
StreamReader sr = new StreamReader("D:\\CSBMTEMP.txt",Encoding.Default);
string str = sr.ReadToEnd();
sr.Close();
proxy.GetString(str);

运行客户端报错:

错误消息为:

格式化程序尝试对消息反序列化时引发异常: 对操作“GetString”的请求消息正文进行反序列化时出现错误。读取 XML 数据时,超出最大字符串内容长度配额 (8192)。

那么看一下传入的字符串大小为238367个字符,因此修改服务端配置文件,而保持客户端配置不变

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<basicHttpBinding>
        <binding name="BasicHttpBinding_IService" maxBufferSize="220000" maxReceivedMessageSize="220000" transferMode="Streamed">
          <readerQuotas maxStringContentLength="240000"/>
        </binding>
</basicHttpBinding>

运行客户端程序,依然报错信息如下:

此次是因为服务端maxBufferSize和maxReceivedMessageSize设置小了,将其设置为270000,客户端保持不变。

客户端抛异常:

服务端参数已经设置的比较大了,但是依然报错,发现客户端没有设置maxStringContentLength这个参数,更改客户端配置,服务端保持不变:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<binding name="BasicHttpBinding_IService" sendTimeout="00:00:10" transferMode="Streamed">
          <readerQuotas maxStringContentLength="240000"/>
</binding>

运行客户端,依然报错

发现服务端maxReceivedMessageSize没有设置,更改客户端配置,服务端保持不变,至此信息被正确接收。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<basicHttpBinding>
        <binding name="BasicHttpBinding_IService" sendTimeout="00:00:10" transferMode="Streamed" maxReceivedMessageSize="270000">
          <readerQuotas maxStringContentLength="240000"/>
        </binding>
</basicHttpBinding>

通过上述测试,发现:

1)当客户端配置不正确或服务端配置不正确时,异常可在客户端捕获,但捕获的异常信息相同,即客户端与服务端因同一类参数配置不正确所引发的异常信息一样,无法通过异常信息分辨出是由于客户端配置不正确还是由于服务端配置不正确引起的。

2)一般地,对于使用basicHttpBinding的服务,当由于配置不正确,抛出异常时,可以通过捕获的异常查看是哪个参数配置不正确,但是使用netTcpBinding的服务则无法通过客户端捕获的异常分辨是哪个参数配置的不正确。

3)客户端与服务端配置不一致时,可正常运行服务,但不一定得到正确的结果。某些资料建议将客户端和服务端配置设置为相同,不失为一种简单的办法,但忽略了配置参数的含义,建议深入理解各个参数的含义,合理配置。

4)多个参数配置不正确时,抛出的异常信息中会选则性地指出某个参数设置不正确,而不是将所有配置不正确的参数都指出来。

-----------------------------------------------------------------------------------------

时间仓促,水平有限,如有不当之处,欢迎指正。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-11-19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
学会WCF之试错法——超时
服务契约 [ServiceContract] public interface IService { [OperationContract] string GetData(int value); [OperationContract] string GetString(string value); [OperationContract] void Upload(Request request)
甜橙很酸
2018/03/08
7330
学会WCF之试错法——超时
学会WCF之试错法——安全配置报错分析
服务端配置 <system.serviceModel> <bindings> <wsHttpBinding> <binding name ="WsHttpBinding_IService" maxReceivedMessageSize="370000" receiveTimeout="00:10:01" maxBufferPoolSize="100"> <readerQuotas maxStringContentLength="240000"/>
甜橙很酸
2018/03/08
6040
学会WCF之试错法——安全配置报错分析
WCF入门(一)--Request Entity Too large 传输的数据量过大
      通过WCF进行数据的查询或者添加的时候,如果数据量过大,一般会报出如下的错误:
令仔很忙
2018/09/14
1.4K0
WCF配置文件与文件下载之坎坷路
题外话:本以为我会WCF了,精通WCF了,毕竟刚做过一个WCF的项目,不就是写写契约接口,然后实现接口,改下配置。最后用控制台或者服务发布一下,不就能用了。不就是简单ABC吗?不是So Easy吗?做第二个项目的时候我悲剧了,被碰的头破血流!忽然发现什么什么都不会(第一个项目比照网上教程一步一步弄的),连写一个简单hello world都写不出来。我之前还以为自己很懂了…… 一、WCF文件配置       为了不重蹈覆辙,这次争取把他整懂整透(当然这才是入门而已)。WCF很强大,它的强大跟它的配置有很大的
hbbliyong
2018/03/06
1.2K0
WCF入门学习(4)
上一篇的学习中碰到一个问题,用地址http://localhost:8080/mex 访问元数据的时候一直提示400 bad request 错误,因为时间太晚了,查了好几遍代码,也没有发现问题。刚刚又试验了一下,解决方案分两步
_淡定_
2018/08/24
3790
WCF入门学习(4)
asmx迷10分钟升级成wcf熟手指南
前言:本文旨在帮助从未接触过wcf(.svc文件)的webservice开发人员,快速将传统的webService/asmx技术迁移到wcf。高手就不用浪费时间往下看了:)
菩提树下的杨过
2019/09/12
8280
创建一个自托管(Self-Host)的WCF Service
若确保上述self-host server能运行,需要用管理员权限开一个powershell,运行:
用户10555056
2023/05/25
5040
学会WCF之试错法——客户端调用基础
1当客户端调用未返回结果时,服务不可用(网络连接中断,服务关闭,服务崩溃等) 客户端抛出异常 异常类型:CommunicationException InnerException: Message:
甜橙很酸
2018/03/08
1.5K0
学会WCF之试错法——客户端调用基础
WCF服务调用超时错误:套接字连接已中止。这可能是由于处理消息时出错或远程主机超过接收超时或者潜在的网络资源问题导致的。本地套接字超时是“00:05:30”(已解决)
  线上正式环境调用WCF服务正常,但是每次使用本地测试环境调用WCF服务时长就是出现:套接字连接已中止。这可能是由于处理消息时出错或远程主机超过接收超时或者潜在的网络资源问题导致的。本地套接字超时是“00:05:30” 这个问题,查阅了网上很多资料各种说法的都有,有的说是什么请求站点不在同一个域下,有的说什么应为datatable中有一个属性没有赋值各种答非所问的问题。其实从错误信息中就可以看出来其实就是调用超时了。
追逐时光者
2021/10/13
2.7K0
WCF学习笔记 5
服务通过 ServiceHost 进行寄宿。可以添加终结以暴露可被调用寻址和调用的资源。
小蜜蜂
2019/09/03
7520
WCF入门学习(3)
废话不多说,前两集大致介绍了一下什么是WCF以及和WCF相关的WebService和.net Remoting的一些东西,今天主角要上场,开始WCF的实现相关的东西。
_淡定_
2018/08/24
4840
WCF入门学习(3)
WCF中的Binding模型之六(完结篇):从绑定元素认识系统预定义绑定
由于绑定对象由一系列有序的绑定元素组成,绑定元素最终决定着信道栈中信道的组成,而信道的组成最终又决定了信道栈对消息进行处理的方式和能力,所有要确定绑定的特性和能力,我们可以通过查看其绑定元素的构成来一窥究竟。为此我们我们写了一个简单的方法,用于列出一个具体的绑定对象所有的绑定元素,在介绍一个个具体的系统绑定中,我会使用该方法: 1: static void ListAllBindingElements(Binding binding) 2: { 3: BindingElementC
蒋金楠
2018/01/16
1K0
Rafy 领域实体框架演示(3) - 快速使用 C/S 架构部署
本系列演示如何使用 Rafy 领域实体框架快速转换一个传统的三层应用程序,并展示转换完成后,Rafy 带来的新功能。 《福利到!Rafy(原OEA)领域实体框架 2.22.2067 发布!》 《Rafy 领域实体框架示例(1) - 转换传统三层应用程序》 《Rafy 领域实体框架演示(2) - 新功能展示》 以 Rafy 开发的应用程序,其实体、仓库、服务代码不需要做任何修改,即可同时支持单机部署、C/S 分布式部署。本文将说明如果快速使用 C/S 分布式部署。 前言 截止到上一篇,我们开发的应用程序都是采
用户1172223
2018/01/30
7120
Rafy 领域实体框架演示(3) - 快速使用 C/S 架构部署
silverlight向wcf传递大于8192字节(8k)的字符串
默认情况下,silverlight在调用wcf时,如果传递的参数长度大于8192字节,即8k,会提示Not Found错误。 解决方法如下: 1、wcf服务端修改web.config 如下: <?xm
菩提树下的杨过
2018/01/23
8050
使命必达: 深入剖析WCF的可靠会话[实例篇](内含美女图片,定力差者慎入)
通过前面一系列的博文(《WCF 并发(Concurrency)的本质》、《并发中的同步》、《实践重于理论》、《并发与实例上下文模式》、《回调与并发》、《ConcurrencyMode.Multiple 模式下的WCF服务就一定是并发执行的吗[上篇]》、《ConcurrencyMode.Multiple 模式下的WCF服务就一定是并发执行的吗[下篇]》、《控制并发访问的三道屏障[上篇]》和《控制并发访问的三道屏障[下篇]》),我对WCF的并发体系进行了深入的剖析,在接下来的博文中,我只要专注于WCF的可靠会话
蒋金楠
2018/01/16
1.2K0
使命必达: 深入剖析WCF的可靠会话[实例篇](内含美女图片,定力差者慎入)
WCF 学习总结2 -- 配置WCF
前面一篇文章《WCF 学习总结1 -- 简单实例》一股脑儿展示了几种WCF部署方式,其中配置文件(App.config/Web.config)都是IDE自动生成,省去了我们不少功夫。现在回过头来看看IDE提供的Wcf Service Library项目模板中的默认服务端配置文件——App.config里面究竟有什么秘密。 服务端的配置文件主要是对services、bindings、behaviors的配置。在默认的App.config中,使用的是WCF Framework定义好的wsHttpBinding默
hbbliyong
2018/03/05
1.1K0
WCF 学习总结2 -- 配置WCF
系统上线后WCF服务最近经常死掉的原因分析总结
  最近系统上线完修改完各种bug之后,功能上还算是比较稳定,由于最近用户数的增加,不知为何经常出现无法登录、页面出现错误等异常,后来发现是由于WCF服务时不时的就死掉了。后来就开始分析问题。得到的初步解决方案如下:
aehyok
2018/08/31
1.1K0
系统上线后WCF服务最近经常死掉的原因分析总结
If WCF Service side and Client side config is different?!
MJ.Zhou
2018/01/04
7040
WCF技术剖析之三十一: WCF事务编程[中篇]
[续《上篇》]通过将TransactionFlowAttribute特性应用在服务契约的某个操作之上,并指定相应的TransactionFlowOption枚举直,仅仅定义了事务流转的策略而已。或者说,通过这种方式确定对事物流转的一种意愿,客户端是否愿意将当前事务流出,服务端是否愿意接受流入的事务,可以通过TransactionFlowAttribute特性进行控制。所以说,服务操作上定义个TransactionFlowAttribute特性是是否进行事务流转的总开关,真正的事务传播是建立在Transact
蒋金楠
2018/01/16
7760
WCF技术剖析之三十一: WCF事务编程[中篇]
找不到具有绑定 NetTcpBinding 的终结点的与方案 net.tcp 匹配的基址。注册的基址方案是 [http]。
找不到具有绑定 NetTcpBinding 的终结点的与方案 net.tcp 匹配的基址。注册的基址方案是 [http]。
liulun
2022/05/09
8500
找不到具有绑定 NetTcpBinding 的终结点的与方案 net.tcp 匹配的基址。注册的基址方案是 [http]。
推荐阅读
相关推荐
学会WCF之试错法——超时
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验