zoukankan      html  css  js  c++  java
  • WCF for .NET CF的一个应用及两个困惑的问题

          头段时间看了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
  • 相关阅读:
    21世纪网络创业新生代中国海归的传承与开创圆桌论坛实录_网络营销_网赚猫 及时更新网络赚钱_网赚项目_兼职_网络营销等相关网赚资讯
    知方可补不足~利用LogParser将IIS日志插入到数据库
    WebApi系列~自主宿主HttpSelfHost的实现
    我心中的核心组件(可插拔的AOP)~第十五回 我的日志组件Logger.Core(策略,模版方法,工厂,单例等模式的使用)
    爱上MVC系列~前端验证与后端数据有效性验证
    第九回 Microsoft.Practices.Unity.Interception实现基于数据集的缓存(针对六,七,八讲的具体概念和配置的解说)
    struts2第一个程序的详解(配图)
    JavaScript中的对象(一)
    SqlServer操作远程数据库
    [leetcode]Binary Tree Inorder Traversal
  • 原文地址:https://www.cnblogs.com/sss/p/1244158.html
Copyright © 2011-2022 走看看