'2016/09'에 해당되는 글 4건

Programming/.NET

웹서비스를 이용하면 SOAP(Simple Object Access Protocol)를 통해 이기종간에 XML통신을 통하여 필요한 정보를 전달할 수 있습니다.

 

웹서비스를 생성하려면 Add New Item 대화상자에서 Web Service(ASMX) 를 선택하고 'Add'버튼을 누릅니다.

 

 

 

웹 서비스를 추가하고 나면 asmx확장자의 파일이 하나 생성되는데 해당 cs파일의 내용은 대략 아래와 같거나 비슷할 것입니다.

 

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
// [System.Web.Script.Services.ScriptService]
public class WebService : System.Web.Services.WebService
{

    [WebMethod]
    public string HelloWorld()
    {
        return "Hello World";
    }
}

 

WebService 특성은 네임스페이스를 의미합니다. 예제에는 URL이 기재되어 있는데 URL이 들어간 특별한 이유는 없고 그냥 원하는 내용을 기입하면 됩니다. 중요한건 '유일한 값'이여야 한다는 것인데 대부분 URL을 사용하는 이유는 http://www.cliel.com/tmpnamespace/i 와 같이 기재하면 유일성을 가질 수 있기 때문입니다.(기재된 URL은 그냥 네임스페이스를 의미하는 '값'일뿐 실제 존재하는가는 중요하지 않습니다.)

 

참고로 WebService에는 Name과 Description 특성을 사용할 수도 있는데

 

[WebService(Namespace = "http://tempuri.org/", Name ="test")]

 

여기에는 각각 웹서비스의 이름과 설명을 담을 수 있습니다.

 

WebServiceBinding은 XML웹 서비스가 구현된 버전을 의미하며 WsiProfiles.BasicProfile1_1은 WS-I Basic Profile 1.0을 준수하고 있다는 것을 말해주고 있습니다.

 

하단의 주석처리된 부분은 AJAX 스크립트에 필요한 내용으로서 필요하다면 그냥 주석을 지우면 됩니다.

 

예제에서는 웹서비스 메소드로 HelloWorld 메소드가 구현되어 있는데 이 메소드에는 WebMethod라는 특성이 존재하며 해당 특성에는 다음과 같은 내용의 속성을 지정할 수 있습니다.

 

 BufferResponse

 이 속성을 true로 설정하면 웹서비스의 응답내용이 메모리에 저장되어 클라이언트에 전송됩니다.

 CacheDuration

 응답내용이 캐시처리되는 시간을 설정합니다. 기본값은 0인데 사용하지 않음을 의미합니다. 입력은 초단위이며 int형의 값을 받습니다.

 Description

 웹서비스 메소드의 설명부분입니다.

 EnableSession

 해당 메소드의 세션기능을 사용하고자 하는 경우 true로 설정합니다.

 TransactionOption

 이 속성값을 true로 설정하면 좀 복잡하지만 내부에 또다른 웹서비스를 호출하는 식으로 2개 이상의 웹서비스가 교차적으로 동작할때 도중 장애가 발생하면 각 처리과정이 롤백되도록 트랜잭션기능을 켤 수 있습니다.

 

위와같이 웹서비스를 만들고 나면 이제 클라이언트에서는 해당 웹서비스를 호출하여 원하는 정보를 얻을 수 있게 됩니다. 웹이든 응용이든 상관없이 또 다른 프로젝트를 하나 생성하여 위에서 만들어 놓은 웹서비스를 호출해 보도록 하겠습니다.

 

생성한 프로젝트의 Solution Explorer창에서 해당 프로젝트를 마우스 오른쪽 클릭하여 Add -> Service Reference 항목을 선택합니다.

 

 

 

Address에 접근가능한 웹서비스의 URL을 입력하고 'Go'버튼을 눌러줍니다. 그러면 해당 웹서비스에 존재하는 메소드를 표시하게 됩니다. 메소드가 확인되면 'OK'버튼을 눌러 프로젝트에 웹서비스항목을 추가합니다.

 

private void button2_Click(object sender, EventArgs e)
{
    ServiceReference.testSoapClient test = new ServiceReference.testSoapClient();
    label1.Text = test.HelloWorld();
}

 

지금 예제에서는 응용프로그램 프로젝트를 생성하고 버튼과 Label컨트롤을 배치한뒤 웹서비스를 위와같이 호출하였습니다. 보시는 바와 같이 웹서비스를 호출하는 방법은 아주 간단합니다.

 

이제 웹서비스가 구현된 곳으로 다시 돌아가 보겠습니다. 예제에서는 HelloWorld라는 메소드가 하나 존재했었는데 실제 웹서비스를 구현하다보면 같은 이름의 메소드를 여러개 만들어 이를 오버로드해야할 경우가 발생합니다.

 

[WebMethod]
public string HelloWorld()
{
    return "Hello World";
}

[WebMethod]
public string HelloWorld(string name)
{
    return "Your Name : " + name + "Hello World";
}

 

하지만 위와 같이 하는것만으로는 불가능하고 WebMethod특성에 MessageName속성을 추가하여 해당 속성값을 달리설정해야 합니다.

 

[WebMethod(MessageName ="Hello1")]
public string HelloWorld()
{
    return "Hello World";
}

[WebMethod(MessageName ="Hello2")]
public string HelloWorld(string name)
{
    return "Your Name : " + name + "Hello World";
}

 

이때 하나더 고려해야할 부분이 있습니다. 위와같이 MessageName속성을 추가하고 나면 WebServiceBinding에 표시되어 있는 WS-I Basic Profile 1.0 명세를 제거해야 합니다. 해당 명세는 웹메소드의 오버로드를 허용하지 않기 때문입니다.

 

[WebServiceBinding(ConformsTo = WsiProfiles.None)]

 

웹서비스는 기본적으로 내부의 데이터를 외부에 공개하기 위한 용도로 사용됩니다. 하지만 그렇다 하더라도 특정 클라이언트에 해당하는 사용자만을 대상으로 웹서비스를 공개해야 하는 경우가 생길 수 있습니다. 예를 들어 접근해 오는 클라이언트는 자신만의 아이디와 암호를 사용해 웹서비스를 사용하도록 할때 아이디와 암호를 전달하여 클라이언트의 인증여부를 처리하는 것입니다.

 

이런 경우 우리는 SOAP Header를 사용하여 웹서비스를 구현할 수 있습니다. 우선 SOAP Header를 구현하기 위한 클래스를 다음과 같이 생성합니다.

 

public class tmpSoapHeader : System.Web.Services.Protocols.SoapHeader
{
    public string user_name;
    public string user_password;
}

 

참고로 해당 클래스는 웹서비스영역과 같은 위치에 있어야 하며 SoapHeader클래스를 상속받아야 합니다. 이제 위에서 작성한 클래스는 웹서비스안에 인스턴스로 만들고 SoapHeader특성을 추가하여 해당 인스턴스이름을 전달하도록 합니다. 그러면 실제 코드안에서 인스턴스를 통해 원하는 속성에 접근이 가능합니다.

 

public class WebService : System.Web.Services.WebService
{
    public tmpSoapHeader tsh;

    [WebMethod]
    [SoapHeader("tsh")]
    public string HelloWorld()
    {
        if (tsh == null)
            return "사용자 인증 실패";

        if (tsh.user_name == "administrator" && tsh.user_password == "1234")
            return "사용자 인증 성공";
        else
            return "사용자 인증 실패";
    }
}

public class tmpSoapHeader : System.Web.Services.Protocols.SoapHeader
{
    public string user_name;
    public string user_password;
}

 

클라이언트에서는 기존에 참조한 웹서비스의 형태가 변경되었으므로 그대로 사용할 수 없고 대신 해당 웹서비스를 마우스 오른쪽 클릭하여 'Update Service Reference'를 선택해 웹서비스기능을 업데이트해야 합니다.

 

그러면 웹서비스에서 추가된 Header클래스를 통해 필요한 정보를 대입하고 웹메소드 호출시 해당 헤더정보를 전달할 수 있습니다.

 

private void button2_Click(object sender, EventArgs e)
{
    ServiceReference.tmpSoapHeader tsh = new ServiceReference.tmpSoapHeader();
    ServiceReference.testSoapClient test = new ServiceReference.testSoapClient();

    tsh.user_name = "administrator";
    tsh.user_password = "1234";

    label1.Text = test.HelloWorld(tsh);
}

 

참고로 해당 웹서비스를 비동기로 호출하려고 시도하면 비동기에 필요한 몇몇 메소드가 존재하지 않음을 알 수 있습니다. 이는 웹서비스를 참조할때 일반운영모드로 웹서비스를 참조했기 때문입니다. 웹서비스의 웹메소드를 비동기로 처리하려면 최초참조시 Add Service Reference 대화상자에서 Advenced... 버튼을 눌러 Generate asynchronous operations를 선택하고 참조해야 합니다.

 

ServiceReference.tmpSoapHeader tsh = new ServiceReference.tmpSoapHeader();
ServiceReference.testSoapClient test = new ServiceReference.testSoapClient(); tsh.user_name = "administrator";
tsh.user_password = "1234";

IAsyncResult ar = test.BeginHelloWorld(tsh, null, null);

while (!ar.IsCompleted)
    label1.Text = "대기중...";

label1.Text = test.EndHelloWorld(ar);

 

웹서비스를 비동기로 호출할 수 있도록 참조하고 나면 위와 같이 웹메소드를 비동기로 호출할 수 있게 됩니다.

 

비동기 호출에서는 자동으로 생성되는 Begin-과 End-메소드를 사용하며 IAsyncResult 개체를 통해 대기상태를 판단할 수 있습니다. 이 개체의 IsCompleted속성이 true라면 EndHelloWorld메소드를 호출하여 즉시 메소드수행 결과를 받아올 수 있습니다.

'Programming > .NET' 카테고리의 다른 글

[C#] 이니셜라이저(initializer)  (0) 2016.10.11
[ASP.NET] 설정파일 - 1  (0) 2016.10.04
[ASP.NET] 웹서비스(Web Service)  (0) 2016.09.27
[ASP.NET] URL 매핑 (URL 라우팅)  (0) 2016.09.21
[ASP.NET] TreeView  (0) 2016.09.13
[ASP.NET] WCF - 2  (0) 2016.09.07
0 0
Programming/.NET

설명하기도 어려운 다음과 같은 긴 URL이 존재하는 경우

 

http://cliel.com/a/b/c/d/e/f/g/h/i/j/k/l/m/n.aspx?param=123

 

web.config를 통해 짧은 주소로 대체할 수 있습니다.

 

<urlMappings>
  <add url="/a.aspx" mappedUrl="/a/b/c/d/e/f/g/h/i/j/k/l/m/n.aspx?param=123"/>
</urlMappings>

 

위 설정을 web.config의 system.web 하위에 작성하면 http://cliel.com/a.aspx URL이 http://cliel.com/a/b/c/d/e/f/g/h/i/j/k/l/m/n.aspx?param=123 전체를 대신합니다.

 

물론 실제 a.aspx파일이 존재하지 않아도 되며 사용자의 브라우저는 여전히 a.aspx로 표시될 것입니다.

'Programming > .NET' 카테고리의 다른 글

[ASP.NET] 설정파일 - 1  (0) 2016.10.04
[ASP.NET] 웹서비스(Web Service)  (0) 2016.09.27
[ASP.NET] URL 매핑 (URL 라우팅)  (0) 2016.09.21
[ASP.NET] TreeView  (0) 2016.09.13
[ASP.NET] WCF - 2  (0) 2016.09.07
[ASP.NET] WCF - 1  (0) 2016.08.31
0 0
Programming/.NET

 1. TreeView

 

TreeView 컨트롤은 계층화된 데이터구조를 표현하는데 사용되는 컨트롤입니다. 때문에 TreeView 의 데이터소스로는 XmlDataSource 나 SiteMapDataSource 컨트롤(IHierarchicalDataSource 인터페이스를 상속받는)만이 사용될 수 있습니다.

 

 2. SiteMap 연동

 

프로젝트에 존재하는 sitemap 파일을 TreeView와 연동하려면 먼저 sitemap데이터를 연결짓는 SiteMapDataSource 컨트롤을 배치하고 TreeView의 DataSourceID에 해당 Data컨트롤의 ID를 지정하면 됩니다.

<asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" />
<asp:TreeView ID="TreeView1" runat="server" DataSourceID="SiteMapDataSource1"></asp:TreeView>

참고로 SiteMapDataSource 는 해당 프로젝트에 Web.sitemap 과 같은 사이트맵 파일이 존재해야 합니다.

 

 

위 예제는 SiteMapDataSource 컨트롤과 TreeView컨트롤을 매핑한 결과입니다.

 

 3. XML 연동

 

XML은 XML파일을 바인딩하는 XmlDataSource 컨트롤을 통해서 연동이 가능합니다. 우선 다음글에서와 같은 내용의 books.xml파일을 생성하고

 

2016/01/18 - [Programming/ASP.NET] - [ASP.NET] XML - 1

 

XmlDataSource 컨트롤로 해당 XML파일을 연결해 보겠습니다.

 

<asp:XmlDataSource ID="XmlDataSource1" runat="server" DataFile="~/books.xml">

</asp:XmlDataSource>

 

그리고 TreeView의 DataSourceID를 XmlDataSource의 ID값으로 설정하면 XML내용이 완벽히 바인딩됩니다.

 

 

 

하지만 경우에 따라 바인딩되는 요소를 제어하고 싶은 경우가 있는데 그럴때는 TreeView의 하위 요소인 DataBindings 요소를 사용하면 됩니다.

 

<asp:TreeView ID="TreeView1" runat="server" DataSourceID="XmlDataSource1">
    <DataBindings>
        <asp:TreeNodeBinding DataMember="catalog" Text="서적관리" />
        <asp:TreeNodeBinding DataMember="book" TextField="id" />
        <asp:TreeNodeBinding DataMember="author" TextField="#InnerText" />
    </DataBindings>
</asp:TreeView>

 

TreeNodeBinding 요소는 XML 의 요소와 1:1로 매핑되며 DataMember 속성으로 실제 매핑될 XML요소를 지정합니다. Text 속성은 XML요소의 내용과는 상관없이 원하는 문자열을 표시하지만 TextField속성을 사용하여 XML요소의 속성을 지정하면 해당 속성값이 문자열로 표시됩니다. 예제에서의 두번째 TextField에는 #InnerText 가 지정되었는데 이것은 속성이 아닌 XML내부의 문자열을 가져오겠다는 의미입니다.

 

 4. 내장 스타일

 

Visual Studio의 디자인 모드에서 스마트태그를 선택하면 다음과 같이 자체지원하는 스타일을 적용할 수 있습니다.

 

 

내장 스타일을 적용하면 해당 스타일 고유의 노드아이콘이 표시되지만 원하는 경우 직접 제작한 이미지를 노드아이콘으로 적용할 수 있습니다.

 

<asp:TreeView ID="TreeView1" runat="server" DataSourceID="XmlDataSource1" ShowCheckBoxes="All" 

CollapseImageUrl="~/dc.gif"></asp:TreeView>


CollapselmageUrl 속성은 하위 노드를 접었을 경우 보여지는 이미지를 의미합니다. 이 밖에 ExpandImageUrl은 하위 노드를 펼쳤을 경우에, LeafNodeStyle-ImageUrl은 최하위 노드에, NoExpandImageUrl은 펼침이 불가능한 노드에, ParentNodeStyle-ImageUrl은 상위노드에, RootNodeStyle-ImageUrl은 루트노드에 대한 노드이미지를 의미합니다.

 

이와 더불어 ShowLines 속성을 True로 설정하면 각 노드간에 연결선을 보여줄 수 있으며 스마트태그를 사용하면 라인과 노드이미지에 대한 전체적인 디자인을 지정할 수 있습니다.(Line에 관한 스타일은 ShowLines가 True로 되어 있어야 사용이 가능합니다.)

 

 5. 노드 선택

 

TreeView는 기본적으로 각 항목을 트리형태로 표시하는 걸로 끝내지만 CheckBox처럼 각 항목에 선택가능한 기능을 부여할 수 있습니다.

 

<asp:XmlDataSource ID="XmlDataSource1" runat="server" DataFile="~/books.xml"></asp:XmlDataSource>
<asp:TreeView ID="TreeView1" runat="server" DataSourceID="XmlDataSource1" ShowCheckBoxes="All">

</asp:TreeView>

 

ShowCheckBoxes 속성은 실제 TreeView에 체크박스를 표시하는데 All값은 모든 노드에, leaf는 최하위 노드에만, None은 없음, Parent는 하위노드가 존재하는 상위노드에만, Root는 최상위 노드에만 체크박스를 적용합니다.

 

사용자가 TreeView의 노드를 선택하고 나면 이를 판단할 수 있는 방법도 있어야 하는데 이 때는 CheckedNodes 속성으로 확인할 수 있습니다.

 

TreeView1.ShowCheckBoxes = TreeNodeTypes.All;

if (TreeView1.CheckedNodes.Count > 0) {

}

 

다만 이것은 선택된 항목이 있는가를 판단하는 것이고 실제 선택된 노드의 요소를 가져오려면 foreach구문을 통해 순회처리를 하면 됩니다.

 

string msg = string.Empty;
foreach (TreeNode tn in TreeView1.CheckedNodes) {
    msg = tn.Text + "가 선택됨";
}

 

 6. 노드 조작

 

TreeView의 노드를 조작하는 작업의 대부분은 프로그램 구현을 통해 이루어 지게 됩니다. 우선 간단하게 다음 메소드를 호출하여 TreeView의 노드를 펼치거나 닫아보겠습니다.

 

TreeView1.ExpandAll();
TreeView1.CollapseAll();

 

페이지가 로드될때 위와 같은 작업을 하고자 한다면 Page_Load안에 넣어서는 안되고 DataBound 이벤트를 선언하여 해당 이벤트 처리기 안에 위 코드를 넣어야 합니다.

 

<asp:TreeView ID="TreeView1" runat="server" DataSourceID="XmlDataSource1" ShowCheckBoxes="All" 

ShowLines="True" OnDataBound="TreeView1_DataBound"></asp:TreeView>

protected void TreeView1_DataBound(object sender, EventArgs e)
{
    TreeView1.CollapseAll();
}

 

만약 특정노트만을 접거나 펼치려면 원하는 해당 노드에 직접적으로 펼침이나 접음메소드를 호출하면 됩니다.

 

<asp:TreeView ID="TreeView1" runat="server" DataSourceID="XmlDataSource1" ShowCheckBoxes="All" 

ShowLines="True" OnDataBound="TreeView1_DataBound">
    <DataBindings>
        <asp:TreeNodeBinding DataMember="catalog" Text="서적관리" />
        <asp:TreeNodeBinding DataMember="book" TextField="id" />
    </DataBindings>
</asp:TreeView>

 

protected void TreeView1_DataBound(object sender, EventArgs e)
{
    TreeView1.CollapseAll();
    TreeView1.FindNode("서적관리").Expand(); //또는 Expanded = true; 로 해도 같음
    TreeView1.FindNode("서적관리/bk102").Expand();
}

 

처리 순서는 먼저 모든 노드를 접은다음 가장 루트노드(서적관리)노드를 펼치고 그 하위에 bk102노드를 펼치도록 합니다. 이때 각 노드의 경로는 '/' 문자로 구분합니다.

 

노드 조작에는 위와 같이 접거나 펼치는것 이외에도 필요에 따라 특정 노드를 추가하거나 삭제해야 하는 경우도 있습니다.

 

우선 노드를 추가하는 것에 대해 알아보자면 TreeNode의 객체를 생성하고 해당 노드에 대한 필요한 속성을 처리한 다음 원하는 위치에 추가하는 순서로 진행됩니다.

 

<asp:Button ID="Button1" runat="server" Text="노드추가" OnClick="Button1_Click" />

protected void Button1_Click(object sender, EventArgs e)
{
    TreeNode tn = new TreeNode();

    tn.Text = "추가된노드";

    TreeView1.Nodes[0].ChildNodes[1].ChildNodes.Add(tn);
}

 

보시는 바와 같이 Nodes나 하위 노드를 지정하는 ChildNodes를 통해서도 노드를 선택할 수 있으며 선택된 노드에 대해 Add메소드를 호출하여 노드를 추가하고 있습니다. 하지만 오해하지 마십시오. TreeView의 노드를 추가하거나 삭제한다 해도 TreeView와 연결된 소스를 변경되지 않습니다.

 

TreeNode tn = TreeView1.FindNode("서적관리/bk102");
TreeView1.Nodes[0].ChildNodes.Remove(tn);

 

위 예제는 검색된 노드를 삭제합니다.

'Programming > .NET' 카테고리의 다른 글

[ASP.NET] 웹서비스(Web Service)  (0) 2016.09.27
[ASP.NET] URL 매핑 (URL 라우팅)  (0) 2016.09.21
[ASP.NET] TreeView  (0) 2016.09.13
[ASP.NET] WCF - 2  (0) 2016.09.07
[ASP.NET] WCF - 1  (0) 2016.08.31
[C#] Stream  (0) 2016.08.24
0 0
Programming/.NET

WCF는 WCF - 1에서 봤던 단순 데이터 제공이외에 특정 데이터모델과 연계한 데이터 서비스 구축이 가능합니다.

 

데이터 서비스를 위헤 우선 프로젝트에 데이터모델을 만들어야 합니다. 데이터 모델에 대해서는 아래 글에서 edmx생성방법을 참고해 주십시오.

 

2016/06/14 - [Programming/.NET] - [ASP.NET] EntityFramework(엔티티프레임워크)

 

참고로 예제에서는 testdb라는 데이터베이스 생성과 함께 USER_TBL테이블을 만들고

 

USE [testdb]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[USER_TBL](
 [name] [nchar](10) NULL,
 [phone] [nchar](10) NULL,
 [address] [nchar](10) NULL,
 [age] [int] NULL
) ON [PRIMARY]

GO

 

name에 키를 설정한 뒤 아래와 같은 데이터를 삽입하였습니다. 그리고 해당 테이블을 대상으로 데이터모델을 생성하였습니다.

 

Insert Into [dbo].[USER_TBL]
Values('홍길동', '0100000000', '서울시', 30);

Insert Into [dbo].[USER_TBL]
Values('홍길남', '0110000000', '대구시', 35);

Insert Into [dbo].[USER_TBL]
Values('홍길순', '0160000000', '부산시', 28);

 

모델을 생성하고 나면 이제 생성한 모델을 대상으로 WCF 데이터 서비스를 생성할 수 있습니다.

 

 

 

프로젝트에서 마우스 오른쪽 버튼을 눌러 Web부분의 WCF Data Service 항목을 선택합니다.

 

public class WcfDataService : DataService< /* TODO: put your data source class name here */ >
{
    // This method is called only once to initialize service-wide policies.
    public static void InitializeService(DataServiceConfiguration config)
    {
        // TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc.
        // Examples:
        // config.SetEntitySetAccessRule("MyEntityset", EntitySetRights.AllRead);
        // config.SetServiceOperationAccessRule("MyServiceOperation", ServiceOperationRights.All);
        config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;
    }
}

 

서비스를 생성하고 나면 위와 비슷한 소스가 표시될 것입니다. 이 상태에서 DataService부분에 이전에 생성한 데이터모델클래스를 포함하도록 합니다.

 

public class WcfDataService : DataService<testdbEntities>

 

이제 해당 svc웹서비스 파일을 웹브라우저에서 호출하면 다음과 같은 XML이 출력될 것입니다.

 

만약 svc를 호출하는데 Request Error가 출력(오류 내용중 element type is not an entity type 이라는 내용이 포함된 경우)되면 해당 Entity클래스에서 DataServiceKey("name") 특성을 추가해 주십시오.

 

[DataServiceKey("name")]
public partial class USER_TBL
{
    public string name { get; set; }
    public string phone { get; set; }
    public string address { get; set; }
    public Nullable<int> age { get; set; }
}

 

참고로 에러발생시 에러에 관한 메세지 내용을 보려면 웹서비스 클래스에 ServiceBehavior특성을 추가해야 합니다.

 

[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
public class WcfDataService : DataService<testdbEntities>

 

2016년 6월 현재 서비스를 만들 수 있는 버전은 6.x대와 5.x대가 있습니다. 가급적 5.x대를 생성하는 것이 아직은 정신건강에 좋을 듯 합니다.

 

XML이 정상적으로 출력된다면 해당 XML에 Default만 나와 있음을 알 수 있습니다. 이것은 외부에서 서비스호출시 아무런 데이터도 조회할 수 없음을 의미하는 것으로 웹 서비스의 클래스를 아래와 같이 수정해야 합니다.

 

public static void InitializeService(DataServiceConfiguration config)
{
    // TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc.
    // Examples:
    config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
    // config.SetServiceOperationAccessRule("MyServiceOperation", ServiceOperationRights.All);
    config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;
}

 

config.SetEntitySetAccessRule- 부분을 주석 제거하고 MyEntityset대신 * 문자를 지정하였습니다. 이것은 외부에서 웹서비스 호출시 서비스가능한 Entity를 지정하는 것입니다. 이때 *문자는 데이터모델에 있는 모든 Entity를 의미하며 EntitySetRights.AllRead 옵션으로 해당 데이터 모델에 대한 읽기가능권한을 부여한 것입니다.

 

 

이제 다시 서비스를 호출하면 위와 같이 표시될 것입니다. 예제에서는 USER_TBL 하나에 대한 모델을 만들었기에 조회 가능한 테이블이 단 하나만 표시되지만 만약 여러개의 테이블을 대상으로 하는 경우 그만큼의 테이블이 표시될 것입니다. 만약 특정 테이블만 제한되어야 한다면 SetEntitySetAccessRule에 * 대신 해당 테이블명을 지정하면 됩니다.

 

USER_TBL테이블에 대한 조회가 가능여부를 확인하였으니 해당 테이블의 모든 데이터를 가져와 보겠습니다.

 

http://test.cliel.com/WcfDataService.svc/USER_TBL

 

위와 같이 URi에 읽고자 하는 테이블명을 지정합니다.

 

 

데이터 서비스는 이와 같은 방법으로 필요한 데이터를 쿼리합니다. 예를 들어 위 XML내용에서 두번째 '홍길동'에 대한 데이터만 필요하다면 다음과 같이 지정할 수 있습니다.

 

http://test.cliel.com/WcfDataService.svc/USER_TBL('홍길동')

 

('홍길동')은 테이블의 id값이 '홍길동'인 데이터를 가져오도록 하는 것입니다. 이것은 USER_TBL의 키가 name이기 때문에 가능합니다.

 

이 밖에 전체 테이블의 내용이 아닌 특정컬럼에 대한 데이터만을 가져오려면 다음과 같이 지정합니다.

 

http://test.cliel.com/WcfDataService.svc/USER_TBL('홍길동')/name

 

만약 USER_TBL이 ORDER_TBL(존재한다고 가정)처럼 다른 테이블과 관계를 맺고 있는 상태에서 ORDER_TBL의 전체 데이터를 찾아보려면 name대신 해당 관계테이블을 명시하면 됩니다.

 

http://test.cliel.com/WcfDataService.svc/USER_TBL('홍길동')/ORDER_TBL

 

이 URI는 관계한 ORDER_TBL의 내용만을 출력하는데 USER_TBL의 내용까지도 포함하여 출력하려면 $expand 키워드를 사용해야 합니다.

 

http://test.cliel.com/WcfDataService.svc/USER_TBL('홍길동')?$expand=ORDER_TBL

 

관계한 테이블이 2개 이상이라면 테이블을 ,로 구분할 수 있습니다.

 

http://test.cliel.com/WcfDataService.svc/USER_TBL('홍길동')?$expand=ORDER_TBL, ETC_TBL

 

위에서 $expand 키워드를 사용했는데 $orderby키워드를 통해서는 정렬을 수행할 수 있습니다.

 

http://test.cliel.com/WcfDataService.svc/USER_TBL?$orderby=name

 

오름차순과 내림차순에 대한 명시는 다음과 같이 지정합니다.

 

http://test.cliel.com/WcfDataService.svc/USER_TBL?$orderby=name desc

 

$top 키워드를 사용하면 상위집계가 가능합니다.

 

http://test.cliel.com/WcfDataService.svc/USER_TBL?$top=10

 

$skip은 무시할 리스트를 지정합니다.

 

http://test.cliel.com/WcfDataService.svc/USER_TBL?$skip=1

 

지금까지는 아주 간단한 쿼리스트링의 예를 알아보았는데 쿼리구문중 가장강력한 $filter 키워드를 사용하면 다소 복잡한 형태로 데이터를 필터링 할 수 있습니다.

 

http://test.cliel.com/WcfDataService.svc/USER_TBL?$filter=age eq 35

 

USER_TBL에서 age값이 35인 데이터를 가져옵니다. 여기서 eq는 '같다'는 의미이며 아래와 같은 논리연산자를 추가적으로 적용할 수 있습니다.

 

 eq

 같다

 ne

 다르다

 gt

 크다

 ge

 크거나 같다

 lt

 작다

 le

 작거나 같다

 and

 논리 and

 or

 논리 or

 not

 논리 not

 

뿐만 아니라 $filter에는 다음과 같은 수학연산자와

 

 add

 더하기

 sub

 빼기

 mul

 곱하기

 div

 나누기

 mod

 나머지

 

각종 함수또한 사용이 가능합니다.

 

 substringof

 문자열포함

 endswith

 마지막 문자열 일치

 startswith

 시작 문자열 일치

 length

 문자열 길이

 indexof

 시작 문자열 포함

 replace

 문자열 교체

 substring

 특정 index에서의 문자열 포함

 tolower

 소문자 변환

 toupper

 대문자 변환

 trim

 공백제거

 concat

 문자열 결합

 day

 날짜비교

 hour

 시간비교

 minute

 분비교

 month

 월비교

 second

 초비교

 year

 년도비교

 round

 소수점 처리

 floor

 반올림

 ceiling

 반내림

 

http://test.cliel.com/WcfDataService.svc/USER_TBL?$filter=startswith(phone, '010')

 

아래는 위와 같이 만들어진 WCF 데이터 서비스를 프로그램에서 어떻게 호출하여 사용할 수 있을지를 보여주고 있습니다.

 

ServiceReference.testdbEntities tn = new ServiceReference.testdbEntities(new Uri("http://test.cliel.com/WcfDataService.svc"));

var query = from n in tn.USER_TBL
            where n.phone.Contains("010")
            select n;

string s = query.ToList()[0].name;

'Programming > .NET' 카테고리의 다른 글

[ASP.NET] URL 매핑 (URL 라우팅)  (0) 2016.09.21
[ASP.NET] TreeView  (0) 2016.09.13
[ASP.NET] WCF - 2  (0) 2016.09.07
[ASP.NET] WCF - 1  (0) 2016.08.31
[C#] Stream  (0) 2016.08.24
[ASP.NET] 개인화(Personalization)  (0) 2016.08.16
WCF
0 0
1
블로그 이미지

클리엘