头段时间看了fox23的两篇 WCF Mobile的文章,就自己动手做了简单的日志填写程序,就是一张数据表,可以记录某日几点到几点做了哪些工作,公司规定每天都要填写。程序结构如下:

服务器端:

  • Foolish.CMIS.Service
  • Foolish.CMIS.WCFHost

客户端:

  • WorkLog4Mobile

具体步骤为:

  1. 新建一个WCF项目,命名为Foolish.CMIS.Service,然后定义一个服务的接口
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
namespace Foolish.CMIS.Service
{
[ServiceContract]
public interface IWorkLogService
{
[OperationContract]
List<LM_WORKLOG> getWorkLog(DateTime aStartDate, DateTime aEnddate, string aLogType, string aUserID);
[OperationContract]
LM_WORKLOG SaveWorkLog(LM_WORKLOG worklog);
[OperationContract]
void DeleteWorkLog(LM_WORKLOG worklog);
[OperationContract]
bool isLogin(string userName, string passWord);
}
}

2.实现接口,利用linq,所以数据库访问实现起来很简单,配置一下,把表一拖,就ok了

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using System.Runtime.InteropServices;
namespace Foolish.CMIS.Service
{
public class WorkLogService : IWorkLogService
{
[DllImport("libPassChk.dll")]
public static extern Boolean IsValidPassword(String APass, String APassEncoded);
public List<LM_WORKLOG> getWorkLog(DateTime aStartDate, DateTime aEnddate, string aLogType, string aUserID)
{
BusinessDataClassesDataContext db = new BusinessDataClassesDataContext();
if (aLogType.Equals(""))
{
var query = from wl in db.LM_WORKLOGs
where (wl.FillPeople == aUserID) && (wl.LogDate < aEnddate) && (wl.LogDate > aStartDate)
orderby wl.LogDate descending
select wl;
return query.ToList<LM_WORKLOG>();
} else
{
var query=from wl in db.LM_WORKLOGs
where wl.FillPeople==aUserID && wl.LogDate<aEnddate && wl.LogDate>aStartDate && wl.Guide_id==aLogType
select wl;
return query.ToList<LM_WORKLOG>();
}
}
#region IWorkLogService
public LM_WORKLOG SaveWorkLog(LM_WORKLOG worklog)
{
BusinessDataClassesDataContext db = new BusinessDataClassesDataContext();
if (worklog.Log_id.Equals(""))
{
db.LM_WORKLOGs.InsertOnSubmit(worklog);
}
else
{
db.LM_WORKLOGs.Attach(worklog, true);
}
db.SubmitChanges();
return worklog;
}
#endregion
#region IWorkLogService
public void DeleteWorkLog(LM_WORKLOG worklog)
{
BusinessDataClassesDataContext db = new BusinessDataClassesDataContext();
db.LM_WORKLOGs.Attach(worklog, true);
db.LM_WORKLOGs.DeleteOnSubmit(worklog);
db.SubmitChanges();
}
#endregion
#region IWorkLogService
public bool isLogin(string userName, string passWord)
{
UserInfoDataClassesDataContext userDB = new UserInfoDataClassesDataContext();
IEnumerable<string> userPassQry = from orgatt in userDB.TORGATTRIBUTEs
where orgatt.FID == "PASSWORD" && (from psn in userDB.TPERSONs where psn.FID == userName select psn.FGUID).Contains(orgatt.FGUID)
select orgatt.FVALUE;
foreach (string userPass in userPassQry) {
return IsValidPassword(passWord, userPass);
}
return false;
}
#endregion
}
}

这个简单的服务就算实现了

3、新建一个web项目,引用Foolish.CMIS.Service这个wcf服务,其实就是给他找了个IIS作为宿主,需要注意的是要把刚才wcf服务配置文件中关于数据库连接及WCF的配置文件拷到webconfig里面,需要把wshttpbinding改为basicHttpBinding,因为WCF  cf只支持BasicHttpBinding和WindowsMobileMailBinding两种方式,还有要加入<serviceMetadata httpGetEnabled="true" />,使netcfSvcUtil.exe可以访问。然后新建一个文件WorkLog.svc,内容如下:

<%@ ServiceHost Language="C#" Debug="true" Service="Foolish.CMIS.Service.WorkLogService"  %>

ok,服务及Hosting都已经成功,服务端已经完成了,现在可以在浏览器中输入http:\\localhost\worklog\WorkLog.svc测试一下。

4、客户端应用,首先需要使用netcfSvcUtil.exe工具生成一些代码

netcfSvcUtil.exe http:\\localhost\worklog\WorkLog.svc

注意这一步尽量要把vs关掉,我在没关掉的情况下老是报错,走了不少弯路

生成了两个文件CFClientBase.cs/WorkLogService.cs,新建一个智能设备项目引入这两个文件就ok了。

下面是使用wcf服务的代码,照抄了fox23的代码

            System.ServiceModel.Channels.Binding binding = WorkLogServiceClient.CreateDefaultBinding();
string remoteAddress = WorkLogServiceClient.EndpointAddress.Uri.ToString();
EndpointAddress endpoint = new EndpointAddress(remoteAddress);
WorkLogServiceClient client = new WorkLogServiceClient(binding, endpoint);
logList = client.getWorkLog(startDate, endDate, "", txtUserName.Text);

简单的四步一个应用就完成了。在我的P800连上PC后测试正常。但是发布到公网上后用手机WAP方式接入后就报错了。下面就是我困惑的两个问题

(其实我写这么多,也就是为了有希望能混到首页上,这样让牛人们说不定能看到我的问题,写的是流水账方式,污染了大家眼睛,不好意思了,呵呵。)

错误如下:

响应消息的内容类型application/vnd.wap.wmlc;charset=utf-8与绑定的内容类型(text/xml;chartset=utf-8)不匹配。如果使用自定义编码器,
请确保正确实现IsContextTypeSupported方法。

网上搜索了一把,也没找到相关类似的问题,所以只能发布到这里看看有没有谁知道怎么搞的了。

下面是我的想法:

1、用netcfsvcutil怎么指定生成消息绑定内容为application/vnd.wap.wmlc,如果生成了这种格式,是不是就不能序列化了
    2、我在网上搜了半天,也没发现IsContextTypeSupported方法的介绍,不知道具体改怎么实现呢

我觉得第二种可能是解决问题的办法

power by SSS

转载于:https://www.cnblogs.com/sss/archive/2008/07/16/1244158.html

WCF for .NET CF的一个应用及两个困惑的问题相关推荐

  1. 利用WCF的callback机制开发一个简单的多人游戏模型

    本文介绍了如何利用WCF和callback机制开发一个简单的多人在线游戏模型. 运行过程如下: 当game service 启动之后,若干个客户端便会自动连接到服务器.当某个客户端点击join gam ...

  2. WCF 第一章 基础 完成一个WCF服务客户端

    当需要和服务通信时WCF为客户端提供了丰富的API.通过Service.ServiceModel实现的API处理将.NET类型转换成XML然后从客户端向服务端发送消息.你可以直接用API编程,或者你可 ...

  3. phpstudy一个域名配置两个网站(一个是thinkphp5,一个是原生php)

    phpstudy一个域名配置两个网站(一个是thinkphp5,一个是原生php) 一.总结 一句话总结:把原生php的网站直接放到thinkphp5的public目录下可以解决以stem.aaaa. ...

  4. [问题解决]不使用PWM调速系统,彻底解决一个L298N带动两个电机却转速不同的问题

    [问题解决]不使用PWM调速系统,彻底解决一个L298N带动两个电机却转速不同的问题 参考文章: (1)[问题解决]不使用PWM调速系统,彻底解决一个L298N带动两个电机却转速不同的问题 (2)ht ...

  5. java提交数据到另一个页面_JS实现把一个页面层数据传递到另一个页面的两种方式...

    由于之前面试,被问到过此问题,所以今天特意整理了一下.由于自己技术水平有限,若存在错误,欢迎提出批评. 本博客整理了两种方式从一个页面层向另一个页面层传递参数. 一. 通过cookie方式 1. 传递 ...

  6. android 多个dialog 交替显示,Android如何在一个AlertDialog中一个接一个地显示两个ListViews...

    我有两个列表.一个列表显示可用列表中的所有可用项目(lv_available_items)和仅次要项目(lv_selected_items).我还希望该选定列表最多占用显示的50%,因此我使用属性&q ...

  7. Oracle中用一个序列给两个表创建主键自增功能的后果

    前几天在创建数据表时,想偷个懒,使用一个序列给两个表创建主键自增功能,结果...... 情景: 为宠物中心创建一个简单的数据库,要求如下: 1.创建一个主人表,字段:主人编号,主人姓名,主人性别,主人 ...

  8. 一个按钮触发两个事件可以吗?

    问: 我想让一个按钮触发两个事件,submit1_click 和submit2_click()可以吗?怎么设?先执行submit1_click,再接着执行submit2_click.是再OnClick ...

  9. 谷歌浏览器怎么重发请求_chrome 浏览器的预提取资源机制导致的一个请求发送两次的问题以及ClientAbortException异常...

    调查一个 pdf 打印报错: ExceptionConverter: org.apache.catalina.connector.ClientAbortException: java.net.Sock ...

最新文章

  1. jquery上传图片
  2. Codeforces 432D Prefixes and Suffixes (KMP、后缀数组)
  3. 《数据库SQL实战》获取所有部门当前manager的当前薪水情况
  4. ejabberd登陆不成功的解决方案
  5. 学习笔记(56):Python实战编程-Menu
  6. P4424-[HNOI/AHOI2018]寻宝游戏【结论】
  7. 放苹果(信息学奥赛一本通-T1222)
  8. Markdown编辑LaTeX数学公式
  9. Ehcache整合spring配置
  10. java 内存分布_java的各类型数据在内存中分配情况详解_
  11. linux中/etc/fstab文件删除或修改了,导致系统无法启动
  12. php小刀娱乐网源码,PHP精仿小刀娱乐网资源下载站网站整站源码
  13. 致远OA A8 漏洞综合工具
  14. Android仿微信朋友圈发布动态
  15. ballerina 学习二十七 项目k8s部署 运行
  16. 毕业论文中的“自动生成目录”设置(经验四)
  17. jenkins 配置git
  18. 西安100w就可以财务自由?靠工资如何崛起!
  19. java判断是否已数字结尾,正则表达式测试字符串是否以数字结尾
  20. Imageware NX V12.1最好的逆向工程软件之一,Surfacer的最新版本

热门文章

  1. 5G NR — 国内运营商的频段和带宽划分
  2. 互联网协议 — TLS 传输层安全协议
  3. 架构师之路 — 部署架构 — 高可用集群 — 主备 HA 系统中的脑裂问题
  4. Openstack组件部署 — keystone(domain, projects, users, and roles)
  5. Windwos 08R2_DNS全面图文详解
  6. DRV8711总是报Pre-driver fault错误原因与处理方法
  7. STM32堆栈大小及位置
  8. NR 5G UE和5G网络功能之间的安全流程
  9. Django使用Social-Auth实现微信第三方网站扫码登录
  10. windows charles response 乱码解决办法