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();
}
}
.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 |