상세 컨텐츠

본문 제목

.Net XML RPC ( Server )

.Net General/.Net XML-RPC

by 탑~! 2011. 11. 17. 10:51

본문

using System; 
using CookComputing.XmlRpc;
using System.Text;
using System.Net;
using System.IO;

 

 

struct userInfo { //사용자 정보 구조체
  public string s_user_id;
  public byte[] bt_user_name;
  public string s_user_email;
};

struct attatchFile {  //첨부파일 다운로드 정보 구조체
  public byte[] bt_file_name;
  public string s_download_url;
};

struct contentInfo {  // 글정보 구조체
  public string s_message_id;
  public byte[] bt_title;
  public byte[] bt_body;
  public string s_url;
  public DateTime dt_date;
};

struct responseInsert { // 글등록시 지식맵서버에 전달메시지 구조체
  public string s_message_id;
  public string s_url;
};

struct responseGetMessage {
  public bool b_has_next;
  public contentInfo[] a_message_list;  
};


class rpcServer : XmlRpcService //xml-rpc를 구현하기 위한 클래스를 상속받는다.
{

  [XmlRpcMethod("service.insertMessage")] //메스드 이름을 설정한다.
  public responseInsert insertMessage(
    userInfo user,  // 파라미터들
    string[] category,
    contentInfo content,
    attatchFile[] file)
  { 
    // 메서드 호출에 대한 반환값을 설정한다.

    responseInsert ret = new responseInsert(); 
    ret.s_message_id = "OK";
    ret.s_url = "
http://127.0.0.1/rpc/xxx.html";
    
    
    // 파일저장, 파일저장에 대한 로그도 출력한다.

    // 넘어온 파라미터들에 대한 작업을 수행하는 부분으로

    // 해당에 필요한 작업에 대한 코딩을 하면 된다.
    Log("Download File Count #" + file.Length);
    for(int i=0; i< file.Length; i++) {
    try {
      Log("filename : " + System.Text.Encoding.Default.GetString(file[i].bt_file_name) + "\t, URL : " + file[i].s_download_url);
      DownLoadFiles(file[i]);
      } catch(Exception e) {
        ret.s_message_id = e.ToString();
        Log(e.ToString());
        }
    }
    Log("\n");
    return ret;  // 서버측에서의 메서드 호출이 종료되어 XML-RPC 라이브러리에서 자동으로 XML형식으로 인자들을 변환하여 준다.
  }

  //로그를 출력해 주는 메서드 XML-RPC메서드는 아니다.  
  private void Log(string message) {
    string logfile = "C:\\Inetpub\\wwwroot\\rpc\\serverlog\\log.txt";
    StreamWriter w = File.AppendText(logfile);
    w.WriteLine("[" + DateTime.Now + "]" + message + "\n");
    w.Close();
  }

 

  [XmlRpcMethod("service.getMessageList")] 
  public responseGetMessage getMessageList(
    userInfo user,
    string[] category,
    int i_page_content_count,
    int i_page_view_num)
  {
    responseGetMessage ret = new responseGetMessage();
// 반환값에 대한 임의의 값들을 세팅한다.

// 이 메서드를 호출한 클라이언트에게 이 값들이 xml형식으로 파싱되어 전송된다.

    ret.b_has_next = true;
    contentInfo[] list = new contentInfo[3];
    System.Text.Encoding EncodingType = System.Text.Encoding.GetEncoding("ks_c_5601-1987");//한글 지원.
    for(int i=0; i < list.Length ;i++) {
      list[i].s_message_id = "ID0000" + i;
      list[i].bt_title = EncodingType.GetBytes("SampleContentTitle#" + i);
      list[i].bt_body = EncodingType.GetBytes("SampleContentBody#" + i);
      list[i].s_url = "
http://127.0.0.1/text/item1345543" + i + ".html";
      list[i].dt_date = new DateTime(2004, 7+i, 28-i, 5, 23, 15, 16);
    }
    ret.a_message_list = list;
    return ret;
  }
  
//파일을 전송받는 부분으로 소켓을 열지 아니하고 http를 통하여 전송받는다.

  private void DownLoadFiles(attatchFile fileInfo) {
    string filefullpath = "C:\\Inetpub\\wwwroot\\rpc\\download\\" + System.Text.Encoding.Default.GetString(fileInfo.bt_file_name);
    
    WebRequest req = WebRequest.Create(fileInfo.s_download_url);
    HttpWebRequest httpReq = (HttpWebRequest)req;
    WebResponse resp = req.GetResponse();
    HttpWebResponse httpresp = (HttpWebResponse)resp;
    
    Stream f_rStream = httpresp.GetResponseStream();
    FileStream f_wStream = new FileStream(filefullpath, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
    BinaryReader b_Reader = new BinaryReader(f_rStream);
    BinaryWriter b_Writer = new BinaryWriter(f_wStream);
    
    Byte[] read = new byte[4096];
    
    int count = 0;
    while ((count = b_Reader.Read(read,0,4096))>0) 
      b_Writer.Write(read, 0, count);
    b_Reader.Close();
    b_Writer.Close();
  f_rStream.Close();
  f_wStream.Close();
    httpresp.Close();
  }
}


출처 : http://blog.naver.com/9namy

'.Net General > .Net XML-RPC' 카테고리의 다른 글

.Net XML RPC ( Client )  (0) 2011.11.17
.Net XML RPC 설정  (0) 2011.11.17
.Net XML RPC  (0) 2011.11.17
Java Type XML RPC  (0) 2011.11.17
Server Side XML RPC (from Apache)  (0) 2011.11.17

관련글 더보기