最近一段时间,一直在折腾Mono,折腾Linux。让我无比痛苦的是Mono下的WCF的坑真的是太多了,这不又遇到了一个莫名其妙的问题。

环境:mono 3.2.1,Jexus 5.4.3,OS CentOS 6.2。

1:定义服务契约

  1. using System.ServiceModel;
  2.  
  3. namespace BugTest.Contract
  4. {
  5. [ServiceContract(Name = "Calculator", Namespace = "http://www.wcfbugtest.com")]
  6. public interface ICalculator
  7. {
  8. [OperationContract]
  9. int Add(int x, int y);
  10. }
  11. }

2:实现服务

  1. WriteInfo方法主要是为了记录当时调用Add方法,传入的X,Y值,也是为了更好的展现这个Bug
  1. using System;
  2. using System.IO;
  3. using System.ServiceModel;
  4. using System.ServiceModel.Activation;
  5. using System.Text;
  6. using BugTest.Contract;
  7.  
  8. namespace BugTest.Service
  9. {
  10. [ServiceBehavior(IncludeExceptionDetailInFaults = true)]
  11. [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
  12. public class CalculatorService : ICalculator
  13. {
  14. public int Add(int x, int y)
  15. {
  16. WriteInfo(string.Format("x={0},y={1}", x, y));
  17. return x + y;
  18. }
  19.  
  20. public void WriteInfo(string logInfo)
  21. {
  22. var type = Type.GetType("Mono.Runtime");
  23. if (type != null)
  24. {
  25. string filePath = "/var/www/getextent/Logs/Info.log";
  26. using (var sw = new StreamWriter(filePath, true, Encoding.UTF8))
  27. {
  28. sw.Write(logInfo + "\r\n");
  29. sw.Flush();
  30. }
  31. }
  32. }
  33. }
  34. }

3:寄宿服务

   主要是看Web.config,我的生产环境客户端使用的是Silverlight,终结点使用的绑定是customBinding,编码方法采用的是Binary Message Encoding,主要是为了减少服务端与客户端传输消息的大小,能够稍微的提升性能。此外,要在Mono下跑WCF,要为站点添加一个Global.asax,在Application_Start添加如下代码:

  1. protected void Application_Start(object sender, EventArgs e)
  2. {
  3. Environment.SetEnvironmentVariable("MONO_STRICT_MS_COMPLIANT", "yes");
  4. }

详细的配置如下:

  1. <configuration>
  2. <system.web>
  3. <compilation debug="true" targetFramework="4.0"/>
  4. <customErrors mode="Off"/>
  5. <httpRuntime/>
  6. </system.web>
  7. <system.serviceModel>
  8. <behaviors>
  9. <serviceBehaviors>
  10. <behavior name="ServiceBehavior">
  11. <serviceMetadata httpGetEnabled="true"/>
  12. <serviceDebug includeExceptionDetailInFaults="false"/>
  13. </behavior>
  14. </serviceBehaviors>
  15. </behaviors>
  16. <bindings>
  17. <customBinding>
  18. <binding name="customBinding0" sendTimeout="00:10:00" openTimeout="00:10:00" closeTimeout="00:10:00">
  19. <binaryMessageEncoding/>
  20. <httpTransport maxReceivedMessageSize="" maxBufferSize=""/>
  21. </binding>
  22. </customBinding>
  23. </bindings>
  24. <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
  25. <services>
  26. <service behaviorConfiguration="ServiceBehavior" name="BugTest.Service.CalculatorService">
  27. <endpoint address="http://192.168.8.141:6060/CalculatorService.svc" binding="customBinding" bindingConfiguration="customBinding0" contract="BugTest.Contract.ICalculator"/>
  28. </service>
  29. </services>
  30. </system.serviceModel>
  31. </configuration>

最后发布站点,部署到Linux下面的Jexus Web服务器上。

4:客户端调用

客户端,可以使用控制台应用程序,添加服务引用,输入服务的地址,生成好客户端的代理文件,及App.config文件。

测试代码如下:

  1. using System;
  2. using MonoClient.ServiceReference;
  3.  
  4. namespace MonoClient
  5. {
  6. class Program
  7. {
  8. static void Main(string[] args)
  9. {
  10. var client = new CalculatorClient();
  11. Console.WriteLine("x + y = {2} where x = {0} and y = {1}", -, , client.Add(-, ));
  12. client.Close();
  13.  
  14. Console.Read();
  15. }
  16. }
  17. }

执行的结果如下:

Log的内容如下:

问题出现了,客户端传入的-1,在服务端莫名其妙地变成了255了。A bug ???

在windows下,使用IIS寄宿服务,是不会有问题。

此外如果使用baseHttpBinding,在Mono下WCF也是不会有问题的。即将配置按下面的方式修改:

  1. <system.serviceModel>
  2. <behaviors>
  3. <serviceBehaviors>
  4. <behavior name="ServiceBehavior">
  5. <serviceMetadata httpGetEnabled="true"/>
  6. </behavior>
  7. </serviceBehaviors>
  8. </behaviors>
  9. <services>
  10. <service name="BugTest.Service.CalculatorService" behaviorConfiguration="ServiceBehavior">
  11. <endpoint binding="basicHttpBinding" contract="BugTest.Contract.ICalculator"/>
  12. </service>
  13. </services>
  14. </system.serviceModel>

问题出在哪里呢? 是binaryMessageEncoding的问题吗?

Mono下的WCF的Bug?的更多相关文章

  1. CentOS7 mono环境连接WCF

    总结下在mono环境中使用Wcf出现的问题以帮助你快速解决问题. 1.昨天在内网Centos7下部署由Windows上开发完成的ASP.NET Mvc4项目,部署到mono环境下遇到了无法找到endp ...

  2. ios下fixed回复框bug的解决方案

    前几天做一个移动端的页面,要加个像微信那样附着在底部的回复框,按照做PC端网页的思路,首先是用fixed,在安卓上测了一下是好的,结果到朋友的iphone6p上就不行了,点击输入框之后它总会跳到屏幕中 ...

  3. jquery的slideUp、slideDown、slideToggle等涉及滑动效果的一系列函数,在IE浏览器下有几处bug

    jquery的slideUp.slideDown.slideToggle等涉及滑动效果的一系列函数,在IE浏览器下有几处bug: 1. 因position引起的问题 影响:IE全系列 症状:在需要sl ...

  4. .Net Core下使用WCF

    在.net core 下的wcf 和framework下的wcf使用方式有点不太一样.在core下用wc,需要安装VS扩展Visual Studio WCF Connected Service,目前这 ...

  5. android一个下拉放大库bug的解决过程及思考

    android一个下拉放大库bug的解决过程及思考 起因 项目中要做一个下拉缩放图片的效果,搜索了下github上面,找到了两个方案. https://github.com/Frank-Zhu/Pul ...

  6. 在IIS8.5的环境下配置WCF的Restful Service

    今天在客户的环境中(Windows Server 2012 R2 + IIS 8.5)搭建Call WCF Restful Service的功能,发现了几个环境配置的问题,记录如下: 1):此环境先安 ...

  7. web标准:img图片在ie6下显示空白的bug解决方案

    在进行页面的DIV+CSS排版时,遇到IE6(当然有时Firefox下也会偶遇)浏览器中的图片元素img下出现多余空白的问题绝对是常见的对于该问题的解决方法也是“见机行事”. 1.将图片转换为块级对象 ...

  8. jquery下ie的margin-left ----bug 以及parseInt方法bug

    ie下使用jquery的方法css('margin-left')可能会出现'auto'----从而使结果不可计算,即便使用parseInt()方法也不行 因为parseInt()方法的bug是如果参数 ...

  9. chrome下float元素下input选中内容bug

    今天在写一个小demo的时候,发现chrome下一个很奇怪的bug. 我的代码如下: <!DOCTYPE html> <html lang="en"> &l ...

随机推荐

  1. 用scikit-learn学习主成分分析(PCA)

    在主成分分析(PCA)原理总结中,我们对主成分分析(以下简称PCA)的原理做了总结,下面我们就总结下如何使用scikit-learn工具来进行PCA降维. 1. scikit-learn PCA类介绍 ...

  2. C语言 · 判定数字

    编写函数,判断某个给定字符是否为数字. 样例输入 9 样例输出 yes #include<stdio.h> int main(){ char c; scanf("%c" ...

  3. 在Sublime Text 3上安装代码格式化插件CodeFormatter

    1.了解CodeFormatter插件 在Sublime Text 3中编写代码,为了能让我们的代码格式变得漂亮整洁,需要一个能自动格式代码的插件.这里发现CodeFormatter插件不错,它能支持 ...

  4. Mac OS、Ubuntu 安装及使用 Consul

    Consul 概念(摘录): Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其他分布式服务注册与发现的方案,比如 Airbnb 的 SmartStac ...

  5. 阿里云服务器上配置并使用: PHP + Redis + Mysql 从配置到使用

    (原创出处为本博客,http://www.cnblogs.com/linguanh/) 目录: 一,下载 二,解压 三,配置与启动 四,测试 Redis 五,配置 phpRedis 扩展 六,综合测试 ...

  6. css元素水平居中和垂直居中的方式

    关于居中的问题,一直处于疑惑不解的状态,知道的几种方法好像也不是每一次都会起到作用,所以更加迷惑.主要是不清楚该 在什么情况下采用哪种解决方法,所以,整理了一些方法,梳理一下思路,做一个总结. 1. ...

  7. FullCalendar日历插件说明文档

    FullCalendar提供了丰富的属性设置和方法调用,开发者可以根据FullCalendar提供的API快速完成一个日历日程的开发,本文将FullCalendar的常用属性和方法.回调函数等整理成中 ...

  8. servlet 简介,待完善

    什么是Servlet?① Servlet就是JAVA 类② Servlet是一个继承HttpServlet类的类③ 这个在服务器端运行,用以处理客户端的请求 Servlet相关包的介绍--javax. ...

  9. 小程序用户反馈 - HotApp小程序统计仿微信聊天用户反馈组件,开源

    用户反馈是小程序开发必要的一个功能,但是和自己核心业务没关系,主要是产品运营方便收集用户的对产品的反馈.HotApp推出了用户反馈的组件,方便大家直接集成使用 源码下载地址: https://gith ...

  10. MySQL加密

    MySQL字段加密和解密 1.加密:aes_encrypt('admin','key') 解密:aes_decrypt(password,'key') 2.双向加密 通过密钥去加密,解密的时候的只有知 ...