반응형

매번 SMTP를 25번 , 587번으로만 보내다가 465 Port는 보내지지 않았었는데

 

해당 아래 소스로 465번 포트도 보내지는 것을 확인했다.

 

아래 소스로 이메일 전송 로직을 만들었다.

[HttpPost]
public void SendEmail_PORT465(HttpFileCollectionBase files, string strPath, string strSubject, string strBody)
{
    System.Web.Mail.MailMessage msg = new System.Web.Mail.MailMessage();
    msg.Subject = strSubject;

    msg.Body = strBody;
    msg.BodyFormat = System.Web.Mail.MailFormat.Html;
    msg.BodyEncoding = System.Text.Encoding.UTF8;

    msg.From = "From";
    msg.To = "To";


    msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserver", "Host");
    msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserverport", "465");
    msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusing", "2");

    msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", "1");
    //User name
    msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", "smtp ID");
    //Password
    msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", "smtp PW");
    msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpusessl", "true");

    System.Web.Mail.SmtpMail.SmtpServer = "smtp Host";
    System.Web.Mail.SmtpMail.Send(msg);


}
반응형

오랜만에 찾아 뵙습니다.

 

현재 회사에서는 Ajax 파리미터를 단일건으로만 보내고 있었습니다.

Object 형식으로 DataTable 형태로 파라미터를 던져 중요한 데이터만 가지고 쿼리를 조지는 형태로만 사용중이였는데

MASTER / DETAIL 형태로 데이터를 가져가야만 하는 로직이 생겨서 아래와 같이 정리합니다.

 

1. JAVASCRIPT (Json 형태 만들기)

var array_mst = new Array();
        var array_dtl = new Array();
        var final_vJsonData = new Object();
        var vJsonData_MST = new Object;
        vJsonData_MST.MST_A = "";
        vJsonData_MST.MST_B = "";
        vJsonData_MST.MST_C = "";
        vJsonData_MST.MST_D = "";
        array_mst.push(vJsonData_MST);

        $.each($("#PutAway_Result_Area tr"), function (i) {

            var vJsonData_DTL = new Object;

            vJsonData_DTL.DTL_A = "";
            vJsonData_DTL.DTL_B = "";
            vJsonData_DTL.DTL_C = "";
            vJsonData_DTL.DTL_D = "";

            array_dtl.push(vJsonData_DTL);
        });

        final_vJsonData.MST = array_mst;
        final_vJsonData.DTL = array_dtl;

 

2. AJAX

$.ajax({
    type: "POST",
    url: "",
    async: true,
    dataType: "json",
    data: { "vJsonData": _fnMakeJson(final_vJsonData) },
    success: function (result) {
        alert();
    }, error: function (xhr, status, error) {
        console.log(error);
    }
});

//C#의 JsonConvert.DeserializeObject<DataSet> 쓰기위해서는 양쪽의 대괄호를 빼야됨
function _fnMakeJson(data) {
    if (data != undefined) {
        var str = JSON.stringify(data);
        if (str.indexOf("[") == -1) {
            str = "[" + str + "]";
        }
        return str;
    }
}

 

3. C#

DataSet ds = JsonConvert.DeserializeObject<DataSet>(JSON파라미터);

 

이와같이 Dataset으로 데이터를 가져와서 조지면 되는것을 2시간이나 허비하면서 삽질 하여 적어둡니다.

 

다음엔 이런 실수 안하길..

반응형

파일 다운로드 로직을 만들었을때 Return File을 사용하여 브라우저에서 다운로드를 받을 수 있게 만들었었다.

이번 프로젝트에서도 파일 다운로드 로직이 있었고 기존대로 사용하였는데 문제가 발생 하였다.

이미지로 데이터 화 시켜서 올렸을 때 '아이폰' 에서는 Content Type에 따라서 확장자가 변경되어 저장이 되고 있었다.

 

실제로 사용하던 Return 형태

return File(파일명, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", 다운로드 받을 때 파일명);

 

Content Type을 보면 알겠지만 예전에 엑셀 파일을 다운로드 받을 때 사용했었던 Excel Content Type 이였는데

브라우저에서 받을 때 혹은 안드로이드에서 받을 때는 문제가 되지 않았다.

 

다만 아이폰에서 받았을 때 이미지 파일임에도 불구하고 뒤에 .xlsx가 붙어서 다운로드가 되었다.

이미지 형태로 여러가지 받아야 하는 상황이여서 파일이 유동적으로 변하기 때문에 골치 아팠다.

 

File 매개변수는 무조건 파일명과 Content Type을 입력해야했기 떄문에 자체적으로 판단하여 파일이 다운로드 됐으면 했는데 아래와 같은 방법으로 해결하였다.

return File(파일명, "application/octet-stream", 다운로드 시 파일명);

 

현재 파일 다운로드 로직 상 bmp , jpg , jpeg , jpe , jfif , tif , tiff , png 해당 확장자만 저장 되게끔 사용되고 있어서 

해당 확장자들은 정상적으로 다운로드 되는 것 까지 확인 하였다.

반응형

오랜만에 C#으로 찾아왔습니다.

 

Linq 라는 것은 데이터와 데이터를 비교하여 필요한 데이터를 다시 새롭게 재 구성하기 위해서 쓰는 것이라고 요번에 습득 하였습니다.

 

이번 로직을 만들면서 2가지를 다시 배웠습니다.

 

1. LinQ는 데이터와 데이터를 재 구성하여 필요한 데이터만 찾을 수 있다.

2. DataTable에도 타입이 존재한다.

 

2번 같은 경우는 select를 다시 할 때 무척이나 애 먹었습니다..

실제 오라클 테이블에 Number로 정의가 되어있어서 데이터테이블로 데이터를 가져왔을때 컬럼 타입이 Int32로 구성되어있어서 그 부분을 확인 하지 못해 엄청난 삽질을 하였습니다.

 

아래는 제가 Linq를 사용하여 데이터를 구성한 로직입니다.

 

감사합니다.

 

//APIdt , Resultdt는 데이터 테이블 형식 입니다. 
var query = (from APIData in APIdt.AsEnumerable()
			 join dbData in Resultdt.AsEnumerable()
			 on new
			 {
				 //비교할 이름을 같게 해주어야 합니다. TEST1 , TEST2
				 TEST1 = APIData.Field<string>("TEST1"),
				 TEST2 = APIData.Field<string>("TEST2")
			 }
			 equals new
			 {
				//비교할 이름을 같게 해주어야 합니다. TEST1 , TEST2
				 TEST1 = dbData.Field<string>("TEST1"),
				 TEST2 = dbData.Field<string>("TEST2")
			 }
			 select new
			 {
				 //Field 형식이 굉장히 중요하기 떄문에 데이터테이블의 타입이 어떤것인지 꼭 확인이 필요합니다. 
				 //Test1 , Test2 , Test3 , Test4는 변수입니다. 
				 Test1 = APIData.Field<string>("REQ_SVC"),
				 Test2 = dbData.Field<int>("FCL_CNT"),
				 Test3 = dbData.Field<int>("LCL_CNT"),
				 Test4 = dbData.Field<int>("CONSOL_CNT")
			 });                    

//데이터테이블을 생성 해 줍니다.
DataTable Final_DT = new DataTable();
Final_DT.Columns.Add("Test1");
Final_DT.Columns.Add("Test2");
Final_DT.Columns.Add("Test3");
Final_DT.Columns.Add("Test4");

//구성된 데이터를 다시 데이터테이블로 만들어줍니다. 
foreach (var item in query)
{
	DataRow Final_Dr = Final_DT.NewRow();
	Final_Dr["Test1"] = item.Test1;
	Final_Dr["Test2"] = item.Test2;
	Final_Dr["Test3"] = item.Test3;
	Final_Dr["Test4"] = item.Test4;
	Final_DT.Rows.Add(Final_Dr);
}

완성된 데이터 테이블
Final_DT

 

반응형

JavaScript에서 C#으로 데이터를 넘길 때 보통은 FormData를 생성하여 데이터를 이동시켜서 파싱하는 방법이나

Object에 담아서 던지는 방법 2가지를 채택하여 저는 사용합니다.

그 중에서 제일 간편하게 사용하는 방법은 Javascript에서 Json형식으로 데이터를 가공하여 사용하는 편인데요

하지만 오늘 설명 할 것은 Object로 바로 넘겨서 데이터를 파싱 및 해당 Object를 다시 넘겨서 다시 파싱하는 방법을 찾아서 정리 하려고 합니다.

다른 좋은 방법이 더 있다면 댓글로 남겨주세요 ㅎㅎ

JavaScript

※Object로 데이터를 묶어서 C#으로 보냅니다.
=======자바스크립트 예제======

 

var callObj = new Object();

callObj.Option = "데이터";
callObj.Type = "데이터";
callObj.SearchText = "데이터";
callObj.Page = "데이터";

$.ajax({
	type: "POST",
	url: "url",
	async: false,
	dataType: "json",
	data: callObj,
success: function (result) {
	결과
}, error: function (xhr)
	에러
}
});

=====C# 예제======
//C# Object 파라미터를 받을 수 있게 만든 매개변수 함수

public class ParamsData
{
	//JavaScript에서 보낼때 key값과 동일하게 맞춰야됩니다.
	public string Option { get; set; }
	public string Type { get; set; }
	public string SearchText { get; set; }
	public int Page { get; set; }
}

//예제 데이터 ParamsData rtnVal(매개변수명)

public string example(ParamsData rtnVal)
{
	string rtnJson = "";
	try
	{
		if (rtnVal != null)
		{
			string strOpt = rtnVal.Option; //JavaScript에서 만든 Key값 으로 데이터 받을 수 있음.
			string strType = rtnVal.Type;
			string strText = rtnVal.SearchText;
			int pageIndex = rtnVal.Page;

       	 	//다른 함수로 Object 데이터를 넘길 때.
       		Another_function(rtnVal); //다른 메소드로 데이터를 한번에 옮길때 Object 형식으로 보내면 됩니다.
    	}
    	return rtnJson;
	}
	catch (Exception e)
	{
	    return rtnJson;
	}
}

 

//다른 함수 (오브젝트 파싱하여 받기)
※Object 형식을 Json으로 파싱 이후 Json데이터를 dictionary로 변환하여 사용한 예제 입니다.
DataTable로 변환 하려고 하였지만 실패하였고 JObject를 사용하여 Json을 파싱 하였지만 for문으로 돌려서 하나씩 가져와야되는 불편함이 있어서 dictionary를 사용하였습니다.
public string Another_function(object value)
{
//JsonConvert를 사용하기 위해서는 NewtonJson.dll을 Nuget에서 다운받아서 사용하여야 합니다.

var dictionary = JsonConvert.DeserializeObject<Dictionary<string, string>>(JsonConvert.SerializeObject(value).ToString());

	string stringOption = dictionary["Option"].ToString();
	string stringType = dictionary["Type"].ToString();
	string stringSearchText = dictionary["SearchText"].ToString();
	string nPage = dictionary["Page"].ToString();

	return "";

}

 

이상 JavaScript 데이터를 C#으로 C#의 Object 데이터를 다른 함수로 전달해서 사용하는 방법을 정리해 보았습니다.
C# 지식이 짧아 더 좋은 방법이 있는지 까지는 백방으로 찾아보았지만 아직까지는 더 좋은 방법을 찾지는 못하였습니다.

정리한 소스가 다른 분들에게 도움이 됐으면 하네요 ㅎㅎ

반응형

ExcelPackage를 사용하여 Dataset로 Excel 만들기.

전체 셀의 옵션 선택도 가능하고 맨 위의 header 부분도 배경화면 및 폰트 적용 가능합니다.

 

using (ExcelPackage pck = new ExcelPackage())
{
	ExcelWorksheet workSheet = pck.Workbook.Worksheets.Add(ds.Tables["Table"].TableName);

	Color DeepBlueHexCode = ColorTranslator.FromHtml("#c6efce");

	//가로 길이
	workSheet.Column(1).Width = 30;
	workSheet.Column(2).Width = 13;
	workSheet.Column(3).Width = 20;
	workSheet.Column(4).Width = 20;
	workSheet.Column(5).Width = 15;
	workSheet.Column(6).Width = 15;
	workSheet.Column(7).Width = 125;
	workSheet.Column(8).Width = 8;

	//세로 정렬
	workSheet.Column(1).Style.VerticalAlignment = ExcelVerticalAlignment.Center;
	workSheet.Column(2).Style.VerticalAlignment = ExcelVerticalAlignment.Center;
	workSheet.Column(3).Style.VerticalAlignment = ExcelVerticalAlignment.Center;
	workSheet.Column(4).Style.VerticalAlignment = ExcelVerticalAlignment.Center;
	workSheet.Column(5).Style.VerticalAlignment = ExcelVerticalAlignment.Center;
	workSheet.Column(6).Style.VerticalAlignment = ExcelVerticalAlignment.Center;
	workSheet.Column(7).Style.VerticalAlignment = ExcelVerticalAlignment.Center;
	workSheet.Column(8).Style.VerticalAlignment = ExcelVerticalAlignment.Center;

	//가로 정렬
	workSheet.Column(1).Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
	workSheet.Column(2).Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
	workSheet.Column(3).Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
	workSheet.Column(4).Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
	workSheet.Column(5).Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
	workSheet.Column(6).Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
	workSheet.Column(7).Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
	workSheet.Column(8).Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;

	//폰트 설정
	workSheet.Column(1).Style.Font.SetFromFont(new System.Drawing.Font("나눔고딕", 10));
	workSheet.Column(2).Style.Font.SetFromFont(new System.Drawing.Font("나눔고딕", 10));
	workSheet.Column(3).Style.Font.SetFromFont(new System.Drawing.Font("나눔고딕", 10));
	workSheet.Column(4).Style.Font.SetFromFont(new System.Drawing.Font("나눔고딕", 10));
	workSheet.Column(5).Style.Font.SetFromFont(new System.Drawing.Font("나눔고딕", 10));
	workSheet.Column(6).Style.Font.SetFromFont(new System.Drawing.Font("나눔고딕", 10));
	workSheet.Column(7).Style.Font.SetFromFont(new System.Drawing.Font("나눔고딕", 10));
	workSheet.Column(8).Style.Font.SetFromFont(new System.Drawing.Font("나눔고딕", 10));

	//Header 부분 스타일 적용
	workSheet.Cells["A1:H1"].Style.Font.Bold = true;
	workSheet.Cells["A1:H1"].Style.Fill.PatternType = ExcelFillStyle.Solid;
	workSheet.Cells["A1:H1"].Style.Fill.BackgroundColor.SetColor(DeepBlueHexCode);

	////테두리 border 적용
	var nBorderRowCount = ds.Tables["Table"].Rows.Count + 1;
	var nRowCount = ds.Tables["Table"].Rows.Count;

	string modelRange = "A1:H" + nBorderRowCount.ToString();

	workSheet.Cells[modelRange].Style.Border.Top.Style = ExcelBorderStyle.Thin;
	workSheet.Cells[modelRange].Style.Border.Left.Style = ExcelBorderStyle.Thin;
	workSheet.Cells[modelRange].Style.Border.Right.Style = ExcelBorderStyle.Thin;
	workSheet.Cells[modelRange].Style.Border.Bottom.Style = ExcelBorderStyle.Thin;

	//세팅 완료된 데이터 뿌려주기
	workSheet.Cells["A1"].LoadFromDataTable(ds.Tables["Table"], true);

	//엑셀 파일 저장
	pck.SaveAs(new FileInfo(strRealPath));
}

 

궁굼하신건 댓글로 남겨주세요~

반응형
if (!string.IsNullOrEmpty(Session["세션명"] as string))
{
       Null 아닐 경우 소스
}

 

반응형
DateTime.Now.ToString("yyyyMMddHHmmssFFF");

 

+ Recent posts