2016. 5. 25. 12:20

아래 코드를 입력하면 클래스 오브젝트를 XML 또는 JSON 타입으로 리턴시켜준다.

[Global.aspx]

public class Global : HttpApplication
{
    void Application_Start(object sender, EventArgs e)
    {
        // 응용 프로그램 시작 시 실행되는 코드
        AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);
        RouteConfig.RegisterRoutes(RouteTable.Routes);

        // Content-type 전역지정
        GlobalConfiguration.Configuration.Formatters.Clear();
        //GlobalConfiguration.Configuration.Formatters.Add(new System.Net.Http.Formatting.XmlMediaTypeFormatter());
        GlobalConfiguration.Configuration.Formatters.Add(new System.Net.Http.Formatting.JsonMediaTypeFormatter());
    }
}


Posted by CoolDragon
2013. 11. 19. 11:36

개발 준비가 완료된 후 

ASP.NET 샘플 사이트를 따라서 샘플을 만들어 보았다.

그 결과 아주 간단하게 챗팅방이 완성되었다.



오페라의 문제인지 확실치는 않지만 이녀석은 메시지를 정상적으로 수신하지 못하는 경우도 있고.. 

메시지 수신도 다른 브라우저에 비하여 늦었다.(버전이 오래된건가 아니면 Polling 방식으로 데이터를 가져오다 먹어버린건지...)


TestSignalR.zip



node.js 에서 web socket 방식의 웹채팅을 본 이후에 웹에서도 간단히 채팅프로그램을 구현하겠구나 생각했는데.. 

MS 진영에서도 이렇게 쉽게 구현할 수 있는 방법을 제공한 다는 것에 호기심을 느끼고 한번 따라 만들어 보았다.

Posted by CoolDragon
2013. 11. 18. 18:00

웹소켓으로 실시간 처리를 할 수 있는 MS쪽 기술이라 하여 샘플을 실행해 보려 하였으나 

실패를 거듭하여 다른이들도 저와같은 동일한 고충을 겪을 사람들이 혹시나 있을까 싶어 정리를 해본다.


우선 VS2012를 가지고 있으면 매우 좋겠지만, 본인은 툴을 보유하고 있지 않은 관계로 VS2010으로 해보기로 결정하였다.

VS2010 환경에서 실행하려면 우선 SP1 를 설치해야 한다.


그 이후 패키지 관리자 콘솔에서 SignalR을 설치하려고 하니.. 잘 설치가 안된다..

그래서 이곳 저곳 헤맸더니 누군가가 답변을 실시간으로 주시더라는.. ㅋㅋ


[첫번째 주요링크]

http://www.asp.net/signalr/overview/signalr-20/getting-started-with-signalr-20/supported-platforms

[두번째 주요링크]

http://www.asp.net/signalr/overview/signalr-1x


SignalR버전에 따라서 사용가능한 환경이 정해져있나보다..

VS2010 버전에서는 Framework 4.5도 사용할 수도 없고 해서 아래와 같이 버전을 명시해서 다운로드 받아줘야 하나보다.

[.NET Framework 4.0 기반]

install-package Microsoft.AspNet.SignalR -Version 1.1.3


[.NET Framework 4.5 기반]

install-package Microsoft.AspNet.SignalR


이렇게하면 SignalR이 설치가 되어 기본적으로 개발을 진행할 수 있는 준비가 되었다고 할 수 있다.

Posted by CoolDragon
2013. 3. 18. 10:01

아래와 같이 하면 Enum으로 데이터를 선언하고 실제 소스에서는 enum 형식으로 비교하고 UI에서는 Description 내용으로 보여줄 수 있다.


    public enum eGameInfo

    {

        [Description("사과")]

        Apple = 1,

        [Description("오렌지")]

        Orange = 2,

        [Description("망고")]

        Mango = 3,

    }


    public class HtmlHelper

    {

        public static string GetComboBoxHtml<TEnum>(string id, string style, TEnum eValue, bool isAll, string allText, string allValue, string[] exceptValues)

        {

            string html = "";


            string[] names = Enum.GetNames(typeof(TEnum));

            Array values = Enum.GetValues(typeof(TEnum));


            html += string.Format("<select id=\"{0}\">", id);

            for (int i = 0; i <= names.Length - 1; i++)

            {

                string value = Convert.ToInt32(values.GetValue(i)).ToString();

                string text = names[i];

                string name = HtmlHelper.GetDescriptName<TEnum>(text);

                if (!string.IsNullOrEmpty(name)) text = name;


                if (exceptValues.Where(code => code.Equals(value)).Count() == 0)

                {                    

                    html += string.Format("    <option value=\"{0}\" {2}>{1}</option>", value, text, eValue.ToString().Equals(values.GetValue(i).ToString()) ? "selected=\"selected\"" : "");

                }

            }

            html += string.Format("</select>");


            return html;

        }


        public static string GetDescriptName<T>(string memberName)

        {

            string name = string.Empty;

            var type = typeof(T);


            foreach (System.Reflection.MemberInfo member in type.GetMember(memberName))

            {

                object[] attributes = member.GetCustomAttributes(false);


                if (attributes.Length != 0)

                {

                    foreach (object attr in attributes)

                    {

                        DescriptionAttribute descAttr = attr as DescriptionAttribute;


                        if (descAttr != null)

                        {

                            name = descAttr.Description;

                            break;

                        }

                    }

                }

            }

            return name;

        }

    }

Posted by CoolDragon
2012. 12. 11. 19:23


JSON 메시지 생성 (출처 : http://code.google.com/p/aspjson/)

JSON_2.0.4.asp

JSON_UTIL_0.1.1.asp

<!-- #include virtual="JSON_2.0.4.asp" -->

<!-- #include virtual="JSON_UTIL_0.1.1.asp" -->

<%

Dim json

Dim person, people(4)


For i = 0 To 4

Set person = jsObject()

person("name") = "park"

person("age") = 20

person("sex") = "male"

Set people(i) = person

Next


Set json = jsObject()

json("count") = Ubound(people)

json("people") = people


Response.Write toJSON(json)

' 결과

{"count":4,"people":[{"name":"park","age":20,"sex":"male"},{"name":"park","age":20,"sex":"male"},{"name":"park","age":20,"sex":"male"},{"name":"park","age":20,"sex":"male"},{"name":"park","age":20,"sex":"male"}]}

%>


JSON 메시지 파싱 (https://github.com/nagaozen/asp-xtreme-evolution/blob/master/lib/axe/classes/Parsers/json2.asp)

json2.asp

<!-- #include virtual="json2.asp" -->


dim Info : set Info = JSON.parse(join(array( _
    "{", _
    " ""firstname"": ""Fabio"",", _
    " ""lastname"": ""長尾"",", _
    " ""alive"": true,", _
    " ""age"": 27,", _
    " ""nickname"": ""nagaozen"",", _
    " ""fruits"": [", _
    " ""banana"",", _
    " ""orange"",", _
    " ""apple"",", _
    " ""papaya"",", _
    " ""pineapple""", _
    " ],", _
    " ""complex"": {", _
    " ""real"": 1,", _
    " ""imaginary"": 2", _
    " }", _
    "}" _
)))

Response.write(Info.firstname & vbNewline) ' prints Fabio
Response.write(Info.alive & vbNewline) ' prints True
Response.write(Info.age & vbNewline) ' prints 27
Response.write(Info.fruits.get(0) & vbNewline) ' prints banana
Response.write(Info.fruits.get(1) & vbNewline) ' prints orange
Response.write(Info.complex.real & vbNewline) ' prints 1
Response.write(Info.complex.imaginary & vbNewline) ' prints 2

Posted by CoolDragon
2012. 12. 11. 17:40



ASP 방식

Function BytesToStr(bytes)
    Dim Stream
    Set Stream = Server.CreateObject("Adodb.Stream")
        Stream.Type = 1 'adTypeBinary
        Stream.Open
        Stream.Write bytes
        Stream.Position = 0
        Stream.Type = 2 'adTypeText
        Stream.Charset = "iso-8859-1"
        BytesToStr = Stream.ReadText
        Stream.Close
    Set Stream = Nothing
End Function
If Request.TotalBytes > 0 Then
    Dim lngBytesCount
        lngBytesCount = Request.TotalBytes
    Response.Write BytesToStr(Request.BinaryRead(lngBytesCount))
End If


ASP.NET 방식

string jsonMessage = string.Empty;
System.IO.Stream inputStream = HttpContext.Current.Request.InputStream;
byte[] inputBuffer = new byte[inputStream.Length];
inputStream.Read(inputBuffer, 0, inputBuffer.Length);

try
{
	jsonMessage = System.Text.Encoding.UTF8.GetString(inputBuffer);
}
catch (Exception ex)
{
	throw ex;
}

return jsonMessage;

Posted by CoolDragon
2011. 1. 21. 12:28

이따금 페이지를 기본 마스터페이지에서 다른 마스터페이지로 보여주고 싶을 경우가 있다.
(없으면 있다고 가정해보자 ㅋㅋ)

그럴 경우 마스터페이지를 코드 비하인드에서  변경할 수 있다.
protected void Page_PreInit(object sender, EventArgs e)
{
            string pop = Request["type"] ?? "";

            switch (pop)
            {
                case "1" :
                    this.MasterPageFile = "B.master"; // 마스터페이지명.확장자 포함
                    break;
                default :
                    break;
            };
}

필히 PreInit 이벤트 영역에서 마스터페이지를 변경해야한다.
동일한 페이지를 다른 형태로 보여줄 때 사용하면 유용할 것 같다.

샘플 소스

Posted by CoolDragon
2010. 12. 1. 15:46

----------------------------------------------------------------------------------------------
1. Extending ASP.NET Web Controls With Custom HTML Attributes

기본적으로 제공해주는 웹 컨트롤들을 정의되지 않은 속성(Attribute)를 사용자(개발자) 임의로 속성을 설정하고 서로 다른 컨트롤 이더라도 공통적인 기능으로 부여하고 싶을때 사용하면 좋을 것 같다.
WebControl(TextBox, Label 등)을 상속받아 Property를 추가하여 사용하는 방법도 있을 수 있지만 닷넷 프레임워크에서 기본으로 제공되는 컨트롤을 사용한다는 장점이 있다.


----------------------------------------------------------------------------------------------
2. Xtended TextBox

----------------------------------------------------------------------------------------------

Posted by CoolDragon
2010. 8. 11. 15:29
아래와 같은 오류가 발생하면 Web.Config에서 설정값 변경작업을 해야한다.

[원인]
자바스크립트로 웹서비스의 WebMethod 호출시 아래와 같은 오류가 발생
이런 형태로 리턴값을 받을때 JSON형태로 리턴을 한다.(Fiddler로 확인 가능)

[오류내용]
 - 한글
JSON JavaScriptSerializer를 사용하여 serialize 또는 deserialize하는 동안 오류가 발생했습니다. 문자열의 길이가 maxJsonLength 속성에 설정된 값을 초과합니다.
 - 영문
Error during serialization or deserialization using the JSON JavaScriptSerializer. The length of the string exceeds the value set on the maxJsonLength property.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    ...
    <system.web.extensions>
      <scripting>
        <webServices>
          <jsonSerialization maxJsonLength="500000" />
        </webServices>
      </scripting>
    </system.web.extensions>
    ...
</configuration>




Posted by CoolDragon
2010. 6. 18. 14:35
웹 컨트롤 툴킷을 사용하여 html 소스보기를 하게되면 자신이 사용하지 않은 자바스크립트가 포함되어 있는것을 확인 할 수 있다. 

 Custom Control을 개발할 때 그 컨트롤에 해당하는 자바스크립트 파일을 포함시키고자 할 때 사용한다. 

커스텀 컨트롤 클래스 선언
[ToolboxData(@"<{0}:CustomGridView runat=""server"" \>")]
public class CustomGridView : GridView
{

}


자바스크립트 파일 생성 및 구현

function MouseEnter(row,bgColor,textColor)
{
    
if (row.getAttribute("Selected"== "true"return;
    
row.style.backgroundColor bgColor;
    
row.style.color textColor;
}

function MouseLeave(row)
{
    
if (row.getAttribute("Selected"== "true"return;
    
row.style.backgroundColor row.getAttribute("OriginalColor");
    
row.style.color row.getAttribute("OriginalTextColor");
}

function MouseDown(row,bgColor,textColor)
{
    
if (row.getAttribute("Selected")=="true")
    { 
        row.style.backgroundColor 
row.getAttribute("OriginalColor");
        
row.style.color row.getAttribute("OriginalTextColor");
        
row.setAttribute("Selected","false");
    
}
    
else
    
{
        row.style.backgroundColor 
bgColor;
        
row.style.color textColor
        row.setAttribute(
"Selected","true");
    
}
}


자바스크립트 파일 리소스 등록

[assembly: WebResource("CustomControls.GridViewScript.js""text/javascript")]


클래스 내부의 자바스크립트 파일 리소스 사용

protected override void OnPreRender(EventArgs e)
{
    
base.OnPreRender(e);
    string 
resourceName "CustomControls.GridViewScript.js";

    
ClientScriptManager cs = this.Page.ClientScript;
    
cs.RegisterClientScriptResource(typeof(CustomControls.CustomGridView), resourceName);
}


실제 구현 페이지에서 선언된 컨트롤을 사용하면 아래와 같은 자바스크립트가 렌더링된다.

<script src="/ControlDemo/WebResource.axd?d=3SnAJwuH.......2&t=633134805717880000" type="text/javascript"></script>


출처 : 

http://weblogs.asp.net/dwahlin/archive/2007/04/29/creating-custom-asp-net-server-controls-with-embedded-javascript.aspx

Posted by CoolDragon