본문 바로가기
[ Program ]/C#

vs2010 에서 WCF REST 프로젝트 무작정 만들기

by 관이119 2012. 9. 17.

새프로젝트를 만든다.

---

Service1.cs 에 보면 [WebInvoke(UriTemplate = "", Method = "POST")]

이렇게 되어있는데 UriTemplate 부분에 매서드의 매개변수를 모두적어줘야한다(class형식이 아닌것만)

예를 들어

[WebGet(UriTemplate = "{id}")]
public SampleItem Get(string id)
{
// TODO: Return the instance of SampleItem with the given id
throw new NotImplementedException();
}

이경우 id 라는 매개변수가 있기대문에 UriTemplate 에 {id} 라고 적어 줬다.

매개변수가 여러개 있는경우는 다음과같이 해주면 된다.

[WebGet(UriTemplate ="GetEventSyncList/{option}/{siteName}/{rowCountByPage}/{pageIndex}")]
EventSequenceData GetEventSyncList(string option,string siteName, string rowCountByPage, string pageIndex)

{

}

---

처음만들어진경우 SampleItem 이라는 클래스는 테스트하는 곳에서도 참초해야하기 때문에 현재 프로젝트에 놔두지 않고 따로 떼어내서 새프로젝트로(클래스 라이브러리) 만든다.

만들어진 클래스 라이브러리 프로젝트에서 Class1 은 지우고 WcfRestService1 프로젝트의 SampleItem 을 복사해서 새로만든 클래스라이브러리 프로젝트에 복사한후 WcfRestService1 프로젝트의 SampleItem 을 삭제한다.

그렇게 하면 전체 프로젝트 그림이 위와 같을것이다.

기존에

// TODO: Edit the SampleItem class
public class SampleItem
{
public int Id { get; set; }
public string StringValue { get; set; }
}

이렇게 되있던 클래스는 새프로젝트로 옮기고

참조추가에서 System.Runtime.Serialization 추가해준후

using System.Runtime.Serialization;(이미 있는경우는 안해줘도됨)

해주고

[DataContract(Namespace = "WcfRestServiceTest1.SampleItem")]
public class SampleItem
{
[DataMember]
public int Id { get; set; }

[DataMember]
public string StringValue { get; set; }
}

이렇게 바꿔준다.

-DataContract 의 Namespace 는 임의로 정하는 이름이다.

이제 WcfRestService1 에서 SampleItem 이없어졌기때문에 다시 새로만든 클래스라이브러리 프로젝트 (Include 로 만들었음) 를

빌드한후 참조추가에서 Include.dll 을 추가해준다.

그리고 WcfRestService1 을 빌드한다.

그리고 WcfRestService1 을 디버깅하면 http://localhost:50808/ 익스플로러창이 뜨고,서비스가 실행된다.

현재 클래스명을 Service1 로 했기때문에 떠있는 익스플로러 창에 http://localhost:50808/Service1/HELP 주소를 쳐서 가보면

만들어져 있는 서비스들에 대해서 확인할수 있다.(50808 같은 경우는 프로젝트마다 다르기때문에 밑에 뜬 숫자를 보고 그숫자로바꾸자)

위와같은 창을 확인할수 있으면 정상적으로 서비스가 실행되는 것이다.

그러면 이제 서비스를 테스트하기위해 테스트용 프로젝트를 만들어보자.

윈폼 프로젝트를 하나 만들어준후 버튼을 하나 추가하자

현재 전체 그림이 위와 같을것이다.

이상태에서 WindowsFormsApplication1 프로젝트에 인터페이스를 하나 추가하자

그리고

아까만든 Include.dll 을 참조추가하고

using Include;

을 써준다.

그리고 System.ServiceModel 과 System.ServiceModel.Web 를 찾아서 참조추가하고

using System.ServiceModel;

using System.ServiceModel.Web;

를 써준다.

(System.ServiceModel.Web 은

c:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.5\System.ServiceModel.Web.dll

에 있는 경우도 있다.)

그후에

interface Interface1
{
}

위와 같이 되있는 인터페이스 소스를

[ServiceContract]
public interface Interface1
{
[WebGet(UriTemplate = "", RequestFormat = WebMessageFormat.Json)]
List<SampleItem> GetCollection();

[WebInvoke(UriTemplate = "", Method = "POST", RequestFormat = WebMessageFormat.Json)]
SampleItem Create(SampleItem instance);

[WebGet(UriTemplate = "{id}", RequestFormat = WebMessageFormat.Json)]
SampleItem Get(string id);

[WebInvoke(UriTemplate = "{id}", Method = "PUT", RequestFormat = WebMessageFormat.Json)]
SampleItem Update(string id, SampleItem instance);

[WebInvoke(UriTemplate = "{id}", Method = "DELETE", RequestFormat = WebMessageFormat.Json)]
void Delete(string id);


}

이렇게 바꿔준다.

이제 WindowsFormsApplication1 에 설정파일을 추가한다.

위와같이 추가해준다.

그리고 추가된 App.config 파일을

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>

</startup>
<system.serviceModel>
<client>
<endpoint name="TestService1" address="http://localhost:50808/Service1"
binding="webHttpBinding"
contract="WindowsFormsApplication1.Interface1"
behaviorConfiguration="RestService" bindingConfiguration="RestServiceBindingConfig" />
</client>
<bindings>
<webHttpBinding>
<binding name="RestServiceBindingConfig" maxBufferSize="6553600" maxBufferPoolSize="6553600" maxReceivedMessageSize="6553600">
<readerQuotas maxDepth="921600" maxStringContentLength="921600" maxArrayLength="921600" maxBytesPerRead="921600" maxNameTableCharCount="921600" />
</binding>
</webHttpBinding>
</bindings>
<behaviors>
<endpointBehaviors>
<behavior name="RestService">
<webHttp />
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
</configuration>

이렇게 바꿔준다.(50808 은 아까 WcfRestService1 실행할때 뜨던 포트번호로 적어줄것)

또 WcfRestService1 의 Web.config 의 내용을

<?xml version="1.0"?>
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<!--<supportedRuntime version="v2.0.50727" />-->
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>

<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>

<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</modules>
</system.webServer>

<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
<standardEndpoints>
<webHttpEndpoint>
<!--
Configure the WCF REST service base address via the global.asax.cs file and the default endpoint
via the attributes on the <standardEndpoint> element below
-->
<standardEndpoint name="" helpEnabled="true" defaultOutgoingResponseFormat="Xml" automaticFormatSelectionEnabled="true" maxBufferSize="6553600" maxBufferPoolSize="6553600" maxReceivedMessageSize="6553600">
<readerQuotas maxDepth="921600" maxStringContentLength="921600" maxArrayLength="921600" maxBytesPerRead="921600" maxNameTableCharCount="921600" />
</standardEndpoint>
</webHttpEndpoint>
</standardEndpoints>
</system.serviceModel>


<system.diagnostics>
<trace autoflush="true" />
<sources>
<source name="System.ServiceModel" switchValue="Information, ActivityTracing" propagateActivity="true">
<listeners>
<add name="sdt" type="System.Diagnostics.XmlWriterTraceListener" initializeData="Server.e2e"/>
</listeners>
</source>
</sources>
</system.diagnostics>

</configuration>

이렇게 바꿔주고

WcfRestService1 의 Service1 에 들어가서

[WebGet(UriTemplate = "{id}")]
public SampleItem Get(string id)
{
// TODO: Return the instance of SampleItem with the given id
return new SampleItem(){Id=1, StringValue="hello "+id };
}

위와같이 Get 을 바꿔준다.

그리고 WindowsFormsApplication1 프로젝트의 Form1 의 소스보기에 들어가서

using System.ServiceModel;
using WcfRestService1;

해준후

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.button1.Click +=new EventHandler(button1_Click);
}

private void button1_Click(object sender, EventArgs e)
{
RestClient r = new RestClient();
MessageBox.Show(r.Get("a10").StringValue);
}
}

public class RestClient : ClientBase<Interface1>, Interface1
{
WebHttpBinding _webBinding = null;
ChannelFactory<Interface1> _channel = null;
Interface1 _proxy = null;

public RestClient()
{
_webBinding = new WebHttpBinding();
_channel = new ChannelFactory<Interface1>("TestService1");
_proxy = _channel.CreateChannel();
}

public SampleItem Get(string id)
{
using (new OperationContextScope((IContextChannel)_proxy))
{
return _proxy.Get(id);
}
}

public List<SampleItem> GetCollection()
{
using (new OperationContextScope((IContextChannel)_proxy))
{
return _proxy.GetCollection();
}
}

public SampleItem Create(SampleItem instance)
{
using (new OperationContextScope((IContextChannel)_proxy))
{
return _proxy.Create(instance);
}
}

public SampleItem Update(string id, SampleItem instance)
{
using (new OperationContextScope((IContextChannel)_proxy))
{
return _proxy.Update(id, instance);
}
}

public void Delete(string id)
{
using (new OperationContextScope((IContextChannel)_proxy))
{
_proxy.Delete(id);
}
}
}

위와같이 소스를 바꿔준다.

그리고 WindowsFormsApplication1 을 빌드해서 버튼을 실행하면 서비스의 Get 을 호출해서 a10 이 출력된다.

 

'[ Program ] > C#' 카테고리의 다른 글

IEnumerable 과 IEnumerator 인터페이스  (0) 2012.09.17
IEnumerator, IEnumerable  (0) 2012.09.17
커스텀 열거자(IEnumerable, IEnumerator)  (0) 2012.09.17
스레드의 상태  (0) 2012.09.17
C# 주의해야 할 문법  (0) 2012.09.17

댓글