VS 2008 mfc 智能应用程序 调用 C# webservice.,一

进过几天的苦战,终于搞定VS 2008 mfc 智能应用程序 调用 C# webservice.,实现PDA 与 服务器的通信 与文件上传,深刻体会到 IT 男是个青春饭。。。。。你嘛!

一开始的思路 只是想实现 PDA 与服务器的文件传输,纠结于 MFC socket 还是Web服务? socket?服务?socket 服务?。。。。。。。。。。。。。

写了个短消息发送接收通信程序,但是一想到发送文件,要分包啦,多线程啦,客户端 ,服务器。。。烦得一米,想想还是采用webservice 吧,C# webservice 不是很简单的东西嘛,结果证明这条道路有蛋疼只能自己体会 !!!!!

1测试1 VS 2008 MFC 窗体应用程序+C# websetvice

1.1 websetvice 发布

    [WebMethod]
    public string uplowadfile(Byte[] fidata,string filename)
    {

        string  str= System.Text.Encoding.Default.GetString(fidata);
           try
        {
          //  MemoryStream ms = new MemoryStream(fidata);
            string filepath = Server.MapPath("~/data/") + filename;
              FileStream stream = new FileStream(filepath , FileMode.OpenOrCreate);
         
            StreamWriter swWriter = new StreamWriter(stream, System.Text.Encoding.Default);  //使用与系统一致的编码方式

            string[] mystr = str.Split('\n');

            foreach (string r in mystr)
            swWriter.WriteLine(r);
            swWriter.Close();
             
           return "finish";


        }
        catch(Exception e)
        {

            return "error"+e.Message;

        }

    }

注意点 参数 Byte[] fidata, 如果想上传图片,必须是二进制流的形式,如果是文本文件 无所谓 Byte[] fidata,还是string

Server.MapPath("~/data/"),表示 虚拟目录下data文件夹,我以新建虚拟目录形式发布服务

注意 编码 防止乱码

1.2 客户端调用,本以为这个C# 应用程序一样,很简单 ,没想到。。。。。。

添加->引用->Web 引用-> 灰的!!!!你嘛。。。。。(原来VS 08 去掉了)

解决方法:项目-属性-常规-公共语言支持 就行了 ,项目自动添加了 所需的.h 文件


#include "WebService.h"
#include <string.h>
using namespace localhost;
using namespace System;
using namespace System::Runtime::InteropServices;
FILE *fp; int flen; char *p; byte *byp; Service ser; if((fp=fopen("G:\\A5.txt","r"))==NULL) { return ; } fseek(fp,0,SEEK_END); flen=ftell(fp); p=(char*)malloc(flen); byp=(byte*)malloc(flen); memset(p,0,flen); //*********************************************记得初始化,否则有乱码 if(p==NULL) { fclose(fp); } fseek(fp,0,SEEK_SET); fread(p,flen,1,fp); p[flen]=0; TRACE("p:%s",p); fclose(fp); *byp=*p; TRACE("byte:%s",p); int len=strlen(p); cli::array< Byte >^ aa = gcnew array< Byte >(len+2); Marshal::Copy((IntPtr)p,aa,0,len); char filename[]="123.txt"; //CString result=ser.uplowadfile(aa); CString result=ser.uplowadfile(aa,gcnew String(filename));

不能把读取的文件 存入Byte[],因为服务是托管的,必须 转化 cli::array< Byte >^ aa = gcnew array< Byte >(len+2); ,因为cli::array 才是托管和非托管通用的。(托管和非托管混合编程,中的数据结构类型转化 什么的 ,哥不懂啊 !!!!)

好了 调用成功