আমার একটি ডাব্লুসিএফ পরিষেবা আছে এবং আমি এটিকে একটি RESTfull পরিষেবা এবং একটি SOAP পরিষেবা হিসাবে প্রকাশ করতে চাই। এর আগে কেউ এরকম কিছু করেছে?
আমার একটি ডাব্লুসিএফ পরিষেবা আছে এবং আমি এটিকে একটি RESTfull পরিষেবা এবং একটি SOAP পরিষেবা হিসাবে প্রকাশ করতে চাই। এর আগে কেউ এরকম কিছু করেছে?
উত্তর:
আপনি পরিষেবাটি দুটি ভিন্ন প্রান্তে প্রকাশ করতে পারেন। এসওএপি একটি এমন বাঁধন ব্যবহার করতে পারে যা এসওএপি সমর্থন করে যেমন বেসিকহ্যাট্পবাইন্ডিং, আরএসএফুল একটি ওয়েবহট্ট্পবাইন্ডিং ব্যবহার করতে পারে। আমি ধরে নিলাম আপনার REST পরিষেবাটি JSON এ থাকবে, সেক্ষেত্রে আপনাকে নিম্নলিখিত আচরণ কনফিগারেশন সহ দুটি প্রান্ত বিন্যাস করতে হবে
<endpointBehaviors>
<behavior name="jsonBehavior">
<enableWebScript/>
</behavior>
</endpointBehaviors>
আপনার দৃশ্যের এন্ডপয়েন্ট পয়েন্ট কনফিগারেশনের একটি উদাহরণ
<services>
<service name="TestService">
<endpoint address="soap" binding="basicHttpBinding" contract="ITestService"/>
<endpoint address="json" binding="webHttpBinding" behaviorConfiguration="jsonBehavior" contract="ITestService"/>
</service>
</services>
সুতরাং, পরিষেবাটি উপলব্ধ হবে
[ওয়েবগেট ]টিকে বিশ্রাম দেওয়ার জন্য অপারেশন চুক্তিতে প্রয়োগ করুন। যেমন
public interface ITestService
{
[OperationContract]
[WebGet]
string HelloWorld(string text)
}
দ্রষ্টব্য, যদি REST পরিষেবাটি JSON এ না থাকে তবে ক্রিয়াকলাপগুলির পরামিতিগুলিতে জটিল ধরণ থাকতে পারে না।
রিটার্ন ফর্ম্যাট হিসাবে সাধারণ পুরানো এক্সএমএলের জন্য, এটি এমন একটি উদাহরণ যা এসওএপি এবং এক্সএমএল উভয়ের জন্যই কাজ করবে।
[ServiceContract(Namespace = "http://test")]
public interface ITestService
{
[OperationContract]
[WebGet(UriTemplate = "accounts/{id}")]
Account[] GetAccount(string id);
}
REST সমতল ওল্ড এক্সএমএল এর জন্য পক্স আচরণ X
<behavior name="poxBehavior">
<webHttp/>
</behavior>
এন্ডপয়েন্ট
<services>
<service name="TestService">
<endpoint address="soap" binding="basicHttpBinding" contract="ITestService"/>
<endpoint address="xml" binding="webHttpBinding" behaviorConfiguration="poxBehavior" contract="ITestService"/>
</service>
</services>
পরিষেবা পাওয়া যাবে
REST অনুরোধটি ব্রাউজারে চেষ্টা করে দেখুন,
SOAP পরিষেবা রেফারেন্স যুক্ত করার পরে SOAP পরিষেবার জন্য ক্লায়েন্ট শেষ বিন্দু কনফিগারেশন অনুরোধ ,
<client>
<endpoint address="http://www.example.com/soap" binding="basicHttpBinding"
contract="ITestService" name="BasicHttpBinding_ITestService" />
</client>
সি # তে
TestServiceClient client = new TestServiceClient();
client.GetAccount("A123");
এটি করার আরেকটি উপায় হ'ল দুটি পৃথক পরিষেবা চুক্তি এবং নির্দিষ্ট কনফিগারেশনের প্রত্যেকটি প্রকাশ করা। এটি কোড স্তরে কিছু নকল তৈরি করতে পারে তবে দিনের শেষে, আপনি এটিকে কাজ করতে চান।
এই পোস্টটি দ্বারা "কমিউনিটি উইকি" ইতিমধ্যেই একটি খুব ভাল উত্তর আছে এবং আমি এও রিক Strahl এর ওয়েব ব্লগে তাকান সুপারিশ, মত WCF বিশ্রাম সম্বন্ধে অনেক ভাল পোস্ট আছে এই ।
আমি উভয়ই এই জাতীয় মাই সার্ভিস-পরিষেবাটি পেতে ব্যবহার করেছি ... তারপরে আমি জাক্য থেকে জিএসকিআর বা এসওএপি থেকে আরএসটি-ইন্টারফেস ব্যবহার করতে পারি।
এটি আমার ওয়েব থেকে এসেছে on কনফিগ:
<system.serviceModel>
<services>
<service name="MyService" behaviorConfiguration="MyServiceBehavior">
<endpoint name="rest" address="" binding="webHttpBinding" contract="MyService" behaviorConfiguration="restBehavior"/>
<endpoint name="mex" address="mex" binding="mexHttpBinding" contract="MyService"/>
<endpoint name="soap" address="soap" binding="basicHttpBinding" contract="MyService"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="MyServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="restBehavior">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
এবং এটি আমার সার্ভিস-ক্লাস (.svc-codebehind, কোনও ইন্টারফেসের প্রয়োজন নেই):
/// <summary> MyService documentation here ;) </summary>
[ServiceContract(Name = "MyService", Namespace = "http://myservice/", SessionMode = SessionMode.NotAllowed)]
//[ServiceKnownType(typeof (IList<MyDataContractTypes>))]
[ServiceBehavior(Name = "MyService", Namespace = "http://myservice/")]
public class MyService
{
[OperationContract(Name = "MyResource1")]
[WebGet(ResponseFormat = WebMessageFormat.Xml, UriTemplate = "MyXmlResource/{key}")]
public string MyResource1(string key)
{
return "Test: " + key;
}
[OperationContract(Name = "MyResource2")]
[WebGet(ResponseFormat = WebMessageFormat.Json, UriTemplate = "MyJsonResource/{key}")]
public string MyResource2(string key)
{
return "Test: " + key;
}
}
আসলে আমি কেবল জসন বা এক্সএমএল ব্যবহার করি তবে তারা উভয়ই এখানে একটি ডেমো উদ্দেশ্যে। সেগুলি ডেটা পাওয়ার জন্য জিইটি-অনুরোধ। ডেটা Toোকাতে আমি বৈশিষ্ট্য সহ পদ্ধতিটি ব্যবহার করব:
[OperationContract(Name = "MyResourceSave")]
[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, UriTemplate = "MyJsonResource")]
public string MyResourceSave(string thing){
//...
আপনি যদি কেবল একটি একক ওয়েব পরিষেবাদি বিকাশ করতে চান এবং এটি অনেকগুলি ভিন্ন প্রান্তে (যেমন এক্সএমএল, জেএসওএন, সিএসভি, এইচটিএমএল আউটপুট সহ SOAP + REST) হোস্ট করেছেন। আপনার সার্ভিসস্ট্যাকটি ব্যবহার করার বিষয়টিও বিবেচনা করা উচিত যা আমি ঠিক এই উদ্দেশ্যেই তৈরি করেছি যেখানে আপনার বিকাশ করা প্রতিটি পরিষেবা স্বয়ংক্রিয়ভাবে এসওএপি এবং রেস্ট উভয় প্রান্তে বক্সের বাইরে কোনও বিন্যাস ছাড়াই উপলব্ধ।
হ্যালো ওয়ার্ল্ড উদাহরণ শো শুধু (কোন কনফিগ প্রয়োজন) সঙ্গে সাথে একটি সহজ তৈরি করার পদ্ধতি:
public class Hello {
public string Name { get; set; }
}
public class HelloResponse {
public string Result { get; set; }
}
public class HelloService : IService
{
public object Any(Hello request)
{
return new HelloResponse { Result = "Hello, " + request.Name };
}
}
অন্য কোনও কনফিগারেশন প্রয়োজন হয় না, এবং এই পরিষেবাটি অবিলম্বে REST এর সাথে পাওয়া যায়:
এটি একটি বন্ধুত্বপূর্ণ এইচটিএমএল আউটপুট (যখন এইচটিটিপি ক্লায়েন্টের সাথে গ্রহণ করা হয়: পাঠ্য / এইচটিএমএল যেমন একটি ব্রাউজার হিসাবে কল করা হয়) এর সাথে অন্তর্নির্মিত হয় যাতে আপনি আপনার পরিষেবার আউটপুট আরও ভালভাবে দেখতে সক্ষম হন।
বিভিন্ন আরআরএসটি ক্রিয়াগুলি পরিচালনা করাও তুচ্ছ, এখানে সি # এর 1 পৃষ্ঠায় একটি সম্পূর্ণ আরএসটি-পরিষেবা সিআরইউডি অ্যাপ্লিকেশন রয়েছে (ডাব্লুসিএফ কনফিগার করতে এটির চেয়ে কম হবে):
এমএসডিএন এর কাছে এখন একটি নিবন্ধ রয়েছে বলে মনে হচ্ছে:
https://msdn.microsoft.com/en-us/library/bb412196(v=vs.110).aspx
ইন্ট্রো:
ডিফল্টরূপে, উইন্ডোজ যোগাযোগ ফাউন্ডেশন (ডাব্লুসিএফ) কেবলমাত্র এসওএপি ক্লায়েন্টদের জন্য এন্ডপয়েন্টগুলি উপলব্ধ করে। কীভাবে করবেন: একটি বেসিক ডাব্লুসিএফ ওয়েব এইচটিটিপি পরিষেবা তৈরি করুন, একটি এন্ডপয়েন্টটি নন-এসওএপি ক্লায়েন্টদের জন্য উপলব্ধ করা হয়। এমন সময় থাকতে পারে যখন আপনি একই চুক্তিটি উভয় উপায়ে, ওয়েব শেষ পয়েন্ট এবং একটি এসওএপি সমাপ্তির অবস্থান হিসাবে উপলব্ধ করতে চান। এই বিষয়টি এটি কীভাবে করতে হয় তার একটি উদাহরণ দেখায়।
আমাদের অবশ্যই আচরণ কনফিগারেশনটি অবশ্যই REST শেষের পয়েন্টে সংজ্ঞায়িত করতে হবে
<endpointBehaviors>
<behavior name="restfulBehavior">
<webHttp defaultOutgoingResponseFormat="Json" defaultBodyStyle="Wrapped" automaticFormatSelectionEnabled="False" />
</behavior>
</endpointBehaviors>
এবং একটি পরিষেবা
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
আচরণগুলির পরে, পরবর্তী পদক্ষেপটি বাইন্ডিং। উদাহরণস্বরূপ basicHttpBinding জন্য সাবান শেষবিন্দু এবং webHttpBinding বিশ্রাম ।
<bindings>
<basicHttpBinding>
<binding name="soapService" />
</basicHttpBinding>
<webHttpBinding>
<binding name="jsonp" crossDomainScriptAccessEnabled="true" />
</webHttpBinding>
</bindings>
পরিশেষে আমাদের পরিষেবা সংজ্ঞা 2 শেষ পয়েন্টটি সংজ্ঞায়িত করতে হবে। শেষ পয়েন্টের ঠিকানা = "" এর দিকে মনোযোগ দিন, যেখানে পরিষেবাটি আরএসএস করা দরকার কিছুই নয়।
<services>
<service name="ComposerWcf.ComposerService">
<endpoint address="" behaviorConfiguration="restfulBehavior" binding="webHttpBinding" bindingConfiguration="jsonp" name="jsonService" contract="ComposerWcf.Interface.IComposerService" />
<endpoint address="soap" binding="basicHttpBinding" name="soapService" contract="ComposerWcf.Interface.IComposerService" />
<endpoint address="mex" binding="mexHttpBinding" name="metadata" contract="IMetadataExchange" />
</service>
</services>
পরিষেবার ইন্টারফেসে আমরা এর বৈশিষ্ট্যগুলি সহ অপারেশনটি সংজ্ঞায়িত করি।
namespace ComposerWcf.Interface
{
[ServiceContract]
public interface IComposerService
{
[OperationContract]
[WebInvoke(Method = "GET", UriTemplate = "/autenticationInfo/{app_id}/{access_token}", ResponseFormat = WebMessageFormat.Json,
RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)]
Task<UserCacheComplexType_RootObject> autenticationInfo(string app_id, string access_token);
}
}
সমস্ত দলে যোগদান করা, এটি আমাদের WCF system.serviceModel সংজ্ঞা হবে।
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="restfulBehavior">
<webHttp defaultOutgoingResponseFormat="Json" defaultBodyStyle="Wrapped" automaticFormatSelectionEnabled="False" />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<basicHttpBinding>
<binding name="soapService" />
</basicHttpBinding>
<webHttpBinding>
<binding name="jsonp" crossDomainScriptAccessEnabled="true" />
</webHttpBinding>
</bindings>
<protocolMapping>
<add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
<services>
<service name="ComposerWcf.ComposerService">
<endpoint address="" behaviorConfiguration="restfulBehavior" binding="webHttpBinding" bindingConfiguration="jsonp" name="jsonService" contract="ComposerWcf.Interface.IComposerService" />
<endpoint address="soap" binding="basicHttpBinding" name="soapService" contract="ComposerWcf.Interface.IComposerService" />
<endpoint address="mex" binding="mexHttpBinding" name="metadata" contract="IMetadataExchange" />
</service>
</services>
</system.serviceModel>
উভয় শেষবিন্দু পরীক্ষা করার জন্য, আমরা ব্যবহার করতে পারি WCFClient করার সাবান এবং পিয়ন থেকে বিশ্রাম ।
এটি কাজ করতে আমি এটিই করেছি। নিশ্চিত করুন যে আপনি
ওয়েবপ্লেটি অটোমেটিক ফরমেটসলেশনএনেবলড = "সত্য" এন্ডপয়েন্ট আচরণের ভিতরে রেখেছেন ।
[ServiceContract]
public interface ITestService
{
[WebGet(BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "/product", ResponseFormat = WebMessageFormat.Json)]
string GetData();
}
public class TestService : ITestService
{
public string GetJsonData()
{
return "I am good...";
}
}
ভিতরে পরিষেবা মডেল
<service name="TechCity.Business.TestService">
<endpoint address="soap" binding="basicHttpBinding" name="SoapTest"
bindingName="BasicSoap" contract="TechCity.Interfaces.ITestService" />
<endpoint address="mex"
contract="IMetadataExchange" binding="mexHttpBinding"/>
<endpoint behaviorConfiguration="jsonBehavior" binding="webHttpBinding"
name="Http" contract="TechCity.Interfaces.ITestService" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8739/test" />
</baseAddresses>
</host>
</service>
শেষ পয়েন্ট আচরণ
<endpointBehaviors>
<behavior name="jsonBehavior">
<webHttp automaticFormatSelectionEnabled="true" />
<!-- use JSON serialization -->
</behavior>
</endpointBehaviors>