ডাব্লুসিএফ পরিষেবাদির জন্য আরআরইএসটি / এসওএপি এন্ডপয়েন্টস


425

আমার একটি ডাব্লুসিএফ পরিষেবা আছে এবং আমি এটিকে একটি RESTfull পরিষেবা এবং একটি SOAP পরিষেবা হিসাবে প্রকাশ করতে চাই। এর আগে কেউ এরকম কিছু করেছে?


ভাল প্রশ্ন এবং দুর্দান্ত উত্তর।
চন্দ্রা আরভি

উত্তর:


584

আপনি পরিষেবাটি দুটি ভিন্ন প্রান্তে প্রকাশ করতে পারেন। এসওএপি একটি এমন বাঁধন ব্যবহার করতে পারে যা এসওএপি সমর্থন করে যেমন বেসিকহ্যাট্পবাইন্ডিং, আরএসএফুল একটি ওয়েবহট্ট্পবাইন্ডিং ব্যবহার করতে পারে। আমি ধরে নিলাম আপনার 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 অনুরোধটি ব্রাউজারে চেষ্টা করে দেখুন,

http://www.example.com/xml/accounts/A123

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");

এটি করার আরেকটি উপায় হ'ল দুটি পৃথক পরিষেবা চুক্তি এবং নির্দিষ্ট কনফিগারেশনের প্রত্যেকটি প্রকাশ করা। এটি কোড স্তরে কিছু নকল তৈরি করতে পারে তবে দিনের শেষে, আপনি এটিকে কাজ করতে চান।


11
যখন আমি .svc আইআইএস-এ কিছু কিছু ভার্চুয়াল ডিরেক্টরিতে কিছু সংস্থাপক / myvirtualdir / service.svc এর হোস্ট করি তখন কেমন লাগে ? কিভাবে আমি এটি অ্যাক্সেস করা উচিত?
সানি মাইলেনভ

আমি এটি আরও একধাপ এগিয়ে নিয়ে যেতে চাই এবং JSON ঠিকানার জন্য এইচটিটিপিএসে একটি বন্ডিং যুক্ত করতে চাই। আমি কেমন করে ঐটি করি? stackoverflow.com/questions/18213472/…
স্টিভ

এটি বলছে যে আমার চুক্তি আইভেন্টসটি অকার্যকর যখন আমি আমার পরিষেবা ইন্টারফেসটি উল্লেখ করার চেষ্টা করি: <পরিষেবা নাম = "ইভেন্টস"> <সমাপ্তি ঠিকানা = "জসন" বাইন্ডিং = "ওয়েবএইচটিপি বাইন্ডিং" আচরণের কনফিগারেশন = "জসনবিহেভিয়ার" চুক্তি = "আইভেন্টস" />। আমার আইভেন্টসটির ইন্টারফেসে একটি [সার্ভিস কনট্রাক্ট] বৈশিষ্ট্য রয়েছে তাই কেন নিশ্চিত তা নয়। </ সেবা>
PositiveGuy

আমি লোকালহোস্ট পেতে পারি : 44652 / মাইআর রিসোর্স / জেসসন কাজ করতে কিন্তু আমি লোকালহোস্টে কাজ করতে একটি আইডি পেতে পারি না : 44652 / মাইআর রিসোর্স / 98 / জেসন । আমি "/ {id}" এর একটি ইউরিপ্যাম্পলেট যুক্ত করার চেষ্টা করেছি, "ইভেন্টস / {আইডি" চেষ্টা করেছিলাম কিন্তু যখন আমি পরিষেবাটি আঘাত করার চেষ্টা করি তখন এটি খুঁজে পায় না। কেবল প্রথমটি কাজ করে, কীভাবে পরবর্তীটি পেতে হবে তা নিশ্চিত নয় কাজ।
PositiveGuy

2
এটি কোনও শারীরিক ফাইলের সাথে কীভাবে কাজ করতে পারে? আমি কেবল 404 ত্রুটি পেয়েছি বলে মনে হচ্ছে, অবশ্যই কিছু অনুপস্থিত রয়েছে
রোবজে

39

এই পোস্টটি দ্বারা "কমিউনিটি উইকি" ইতিমধ্যেই একটি খুব ভাল উত্তর আছে এবং আমি এও রিক 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){
    //...

এই ওয়েবজেট এবং ওয়েবআইভোকেট বৈশিষ্ট্যগুলি যুক্ত করে আপনি কী উপকার পাবেন তা আপনি জানতে আগ্রহী।
ড্যারেল মিলার

2
আপনি ব্রাউজারের মাধ্যমে অনুরোধ করতে পারেন: লোকালহোস্ট / মাই সার্ভিস.এসভিসি / মাইএক্সএমএল রিসোর্স / পরীক্ষা এবং স্পষ্টভাবে জাসন বা এক্সএমএল ফর্ম্যাটটি বলতে পারেন। : আপনি একই পদ্ধতি উভয় প্রতিক্রিয়া জানাতে চান, তাহলে এখানে একটি লিঙ্ক blogs.msdn.com/dotnetinterop/archive/2008/11/04/...
Tuomas Hietanen

এটি পরীক্ষার উদ্দেশ্যে। আপনার শেষ পয়েন্টগুলি কাজ করছে কিনা তা দেখতে কেবল। আপনি কি সোপুআইয়ের দিকে তাকিয়েছেন? soapui.org
ড্যারেল মিলার

@ টিউমাসহিয়েটেনেন - ওয়েবএইচটিপি ব্যবহার করে আমি জেএসএন টাইপের প্রতিক্রিয়া পাই না তবে সক্ষম ওয়েবস্ক্রিপ্ট ব্যবহার করে আমি জেএসএন টাইপের প্রতিক্রিয়া পাই। আমি রেসপন্স ফর্ম্যাটটিকে ওয়েবমেসেজ ফরম্যাট.জসন হিসাবে রেখেছি। অন্যদিকে আমি ইউআরআইটিপ্লেট ব্যবহার করতে পারি না যদি আমি সক্ষম ওয়েবস্ক্রিপ্ট আচরণ ব্যবহার করি। কোন ধারনা?
smile.al.d.way

1
@ কফিএডিক্ট্ট - আপনার ইন্টারফেসটি কেন ব্যবহার করা উচিত? শুধু ইন্টারফেস আছে? আপনি এই ইন্টারফেসটি আর কখনও ব্যবহার করতে পারবেন না। এটি সহজ।
টুওমাস হিটানেন

25

আপনি যদি কেবল একটি একক ওয়েব পরিষেবাদি বিকাশ করতে চান এবং এটি অনেকগুলি ভিন্ন প্রান্তে (যেমন এক্সএমএল, জেএসওএন, সিএসভি, এইচটিএমএল আউটপুট সহ 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 পৃষ্ঠায় একটি সম্পূর্ণ আরএসটি-পরিষেবা সিআরইউডি অ্যাপ্লিকেশন রয়েছে (ডাব্লুসিএফ কনফিগার করতে এটির চেয়ে কম হবে):


7

এমএসডিএন এর কাছে এখন একটি নিবন্ধ রয়েছে বলে মনে হচ্ছে:

https://msdn.microsoft.com/en-us/library/bb412196(v=vs.110).aspx

ইন্ট্রো:

ডিফল্টরূপে, উইন্ডোজ যোগাযোগ ফাউন্ডেশন (ডাব্লুসিএফ) কেবলমাত্র এসওএপি ক্লায়েন্টদের জন্য এন্ডপয়েন্টগুলি উপলব্ধ করে। কীভাবে করবেন: একটি বেসিক ডাব্লুসিএফ ওয়েব এইচটিটিপি পরিষেবা তৈরি করুন, একটি এন্ডপয়েন্টটি নন-এসওএপি ক্লায়েন্টদের জন্য উপলব্ধ করা হয়। এমন সময় থাকতে পারে যখন আপনি একই চুক্তিটি উভয় উপায়ে, ওয়েব শেষ পয়েন্ট এবং একটি এসওএপি সমাপ্তির অবস্থান হিসাবে উপলব্ধ করতে চান। এই বিষয়টি এটি কীভাবে করতে হয় তার একটি উদাহরণ দেখায়।


3

আমাদের অবশ্যই আচরণ কনফিগারেশনটি অবশ্যই 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 করার সাবান এবং পিয়ন থেকে বিশ্রাম


প্রত্যাশার মতো ঠিকঠাক কাজ করা
শিব

0

এটি কাজ করতে আমি এটিই করেছি। নিশ্চিত করুন যে আপনি
ওয়েবপ্লেটি অটোমেটিক ফরমেটসলেশনএনেবলড = "সত্য" এন্ডপয়েন্ট আচরণের ভিতরে রেখেছেন

[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>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.