প্রতিটি ডাব্লুসিএফ কলটিতে কাস্টম এইচটিটিপি শিরোনাম কীভাবে যুক্ত করবেন?


162

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

যদি এটি একটি ভাল ধারণা হয় তবে আমি শনাক্তকরণের শিরোনামটিতে স্বয়ংক্রিয়ভাবে কীভাবে যুক্ত করতে পারি। অন্য কথায়, ব্যবহারকারী যখনই ডাব্লুসিএফ পদ্ধতিটি কল করে তখন শনাক্তকারীকে স্বয়ংক্রিয়ভাবে শিরোনামটিতে যুক্ত করতে হবে।

আপডেট: ক্লায়েন্টগুলি যে ডাব্লুসিএফ পরিষেবা ব্যবহার করছে তারা হ'ল উইন্ডোজ অ্যাপ্লিকেশন এবং উইন্ডোজ মোবাইল অ্যাপ্লিকেশন (কমপ্যাক্ট ফ্রেমওয়ার্ক ব্যবহার করে)।


1
আপনি কি আপনার সমস্যার সমাধান করতে পেরেছিলেন?
ভাল

আপনি কি এইটি কমপ্যাক্ট ফ্রেমওয়ার্কে কাজ করে শেষ করেছেন?
ভ্যাকাকানো

উত্তর:


185

এর সুবিধাটি হ'ল এটি প্রতিটি কলে প্রয়োগ করা হয়।

একটি ক্লাস তৈরি করুন যা IClientMessageInspector প্রয়োগ করে । বিফারসেন্ডরয়েস্ট পদ্ধতিতে বহির্গামী বার্তায় আপনার কাস্টম শিরোনাম যুক্ত করুন। এটি দেখতে এরকম কিছু দেখাচ্ছে:

    public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request,  System.ServiceModel.IClientChannel channel)
{
    HttpRequestMessageProperty httpRequestMessage;
    object httpRequestMessageObject;
    if (request.Properties.TryGetValue(HttpRequestMessageProperty.Name, out httpRequestMessageObject))
    {
        httpRequestMessage = httpRequestMessageObject as HttpRequestMessageProperty;
        if (string.IsNullOrEmpty(httpRequestMessage.Headers[USER_AGENT_HTTP_HEADER]))
        {
            httpRequestMessage.Headers[USER_AGENT_HTTP_HEADER] = this.m_userAgent;
        }
    }
    else
    {
        httpRequestMessage = new HttpRequestMessageProperty();
        httpRequestMessage.Headers.Add(USER_AGENT_HTTP_HEADER, this.m_userAgent);
        request.Properties.Add(HttpRequestMessageProperty.Name, httpRequestMessage);
    }
    return null;
}

তারপরে একটি এন্ড পয়েন্ট আচরণ তৈরি করুন যা ক্লায়েন্ট রানটাইমের জন্য বার্তা পরিদর্শককে প্রয়োগ করে। কোনও আচরণের এক্সটেনশন উপাদান ব্যবহার করে আপনি কোনও বৈশিষ্ট্যের মাধ্যমে বা কনফিগারেশনের মাধ্যমে আচরণটি প্রয়োগ করতে পারেন।

সমস্ত অনুরোধ বার্তায় কীভাবে এইচটিটিপি ব্যবহারকারী-এজেন্ট শিরোনাম যুক্ত করবেন তার একটি দুর্দান্ত উদাহরণ এখানে । আমি আমার কয়েকটি ক্লায়েন্টে এটি ব্যবহার করছি। আপনি IDispatchMessageInspector কার্যকর করে পরিষেবা পক্ষের ক্ষেত্রেও এটি করতে পারেন

এই আপনি মনের মধ্যে ছিল কি?

আপডেট: আমি ডাব্লুসিএফ বৈশিষ্ট্যগুলির এই তালিকাটি পেয়েছি যা কমপ্যাক্ট ফ্রেমওয়ার্ক দ্বারা সমর্থিত। আমি 'চ্যানেল extensibility' যা, এই পোস্টে অনুযায়ী, শ্রেণীবদ্ধ বার্তা পরিদর্শকগণ বিশ্বাস হয় কম্প্যাক্ট ফ্রেমওয়ার্ক দ্বারা সমর্থিত।


2
@ মার্ক, এটি সত্যিই দুর্দান্ত উত্তর। ধন্যবাদ। আমি নেট.টিসিপি দিয়ে এটি চেষ্টা করেছি তবে সরাসরি শিরোনাম সংগ্রহটি ব্যবহার করছি (এইচটিপিপি শিরোনামগুলি কাজ করে না)। সার্ভিস হস্ট আফটার রিসিপরেইকেষ্ট ইভেন্টে আমি আমার টোকেন (নাম) সহ একটি শিরোলেখ পেয়েছি, তবে মানটি হয় না (এমনকি কোনও মানের জন্য কোনও সম্পত্তি বলে মনে হয় না?)। আমি কি অনুপস্থিত কিছু আছে? আমি শিরোনামটি তৈরি করার সময় যেমন একটি নাম / মান জুটির প্রত্যাশা করতাম এটি আমাকে জিজ্ঞাসা করে: অনুরোধ।হিডার্স.এড (বার্তাহিডার। ক্রেইটহাইডার (নাম, এনএস, মান));
প্রোগ্রাম। এক্স

13
OutgoingMessagePropertiesHTTP শিরোলেখগুলিতে অ্যাক্সেস করার জন্য আপনার প্রয়োজনীয় কি +1 - OutgoingMessageHeadersযা এসওএপি শিরোনাম নয়।
স্লিভারনিঞ্জা - এমএসএফটি

1
সহজভাবে, দুর্দান্ত কোড! :)
অভিল্যাশ

3
এটি কেবলমাত্র একটি হার্ডকোডযুক্ত ব্যবহারকারী এজেন্টকে মঞ্জুরি দেয়, যা - প্রদত্ত উদাহরণ অনুসারে - ওয়েবকনফাইগে হার্ডকোডযুক্ত!
ক্রিশ্চিয়ানবি

1
এটি একটি দুর্দান্ত উত্তর। যখন এইচটিটিপিআরকুয়েস্টম্যাসেজপ্রোপার্টি.নামটি বার্তা বৈশিষ্ট্যগুলিতে এখনও উপলভ্য নয় তখন এটি কেসটি পরিচালনা করে। কোনও কারণে, আমার কোডটি ডিবাগ করে, আমি বুঝতে পেরেছিলাম যে কিছু সময় সংক্রান্ত সমস্যার উপর নির্ভর করে এই মানটি সর্বদা থাকে না। ধন্যবাদ মার্ক!
carlos357

80

আপনি এটি ব্যবহার করে এটি কলটিতে যুক্ত করুন:

using (OperationContextScope scope = new OperationContextScope((IContextChannel)channel))
{
    MessageHeader<string> header = new MessageHeader<string>("secret message");
    var untyped = header.GetUntypedHeader("Identity", "http://www.my-website.com");
    OperationContext.Current.OutgoingMessageHeaders.Add(untyped);

    // now make the WCF call within this using block
}

এবং তারপরে, সার্ভার-সাইডটি আপনি এটি ব্যবহার করে দখল করেন:

MessageHeaders headers = OperationContext.Current.IncomingMessageHeaders;
string identity = headers.GetHeader<string>("Identity", "http://www.my-website.com");

5
আপনার জন্য কোড স্নিপেট ধন্যবাদ। তবে এর সাথে আমাকে যখনই কোনও পদ্ধতিতে কল করতে চাইছে ততবার শিরোনামটি যুক্ত করতে হবে। আমি এই প্রক্রিয়াটি স্বচ্ছ করতে চেয়েছিলাম। আমি একবার প্রয়োগ করার সাথে সাথে বোঝাতে চাইছি, প্রতিবার ব্যবহারকারী কোনও পরিষেবা ক্লায়েন্ট তৈরি করে এবং কোনও পদ্ধতি ব্যবহার করলে গ্রাহক শিরোনামটি স্বয়ংক্রিয়ভাবে বার্তায় যোগ হয়।
শ্রীতাইকান্দি

এই এই উত্তর দেওয়া পরামর্শের উপর প্রসারিত করতে একটি উদাহরণ সঙ্গে একটি ভাল দুটিই MSDN লিঙ্ক msdn.microsoft.com/en-us/library/...
atconway

1
ধন্যবাদ, আপনি যদি কাস্টম ক্লায়েন্ট লাইব্রেরি ব্যবহার করেন তবে এটি কোডের একটি দুর্দান্ত অংশ। এইভাবে আপনার মেসেজিনস্পেক্টরটি প্রয়োগ করতে হবে না। কেবলমাত্র একটি সাধারণ মোড়কের পদ্ধতি তৈরি করুন যা প্রতিটি ক্লায়েন্ট কলকে অপারেশনকন্টেক্সটস্কোপে মোড়ানো।
জাস্টামার্টিন

3
একটি নোট হিসাবে, যদি আপনি আপনার কলগুলির সাথে কোনও ধরণের অ্যাসিঙ্ক স্টাফ করেন তবে এটি সমস্যাযুক্ত কারণ কারণ OperationContextScope(এবং OperationContext) ThreadStatic- মার্ক গুডের উত্তর ThreadStaticআইটেমগুলির উপর নির্ভর না করেই কাজ করবে ।
জিমদানেন

2
এটি কোনও HTTP শিরোনাম যোগ করে না! এটি এসওএপি খামে শিরোনাম যুক্ত করে।
br3nt

32

আপনি যদি পরিষেবাটিতে সমস্ত অনুরোধগুলিতে কেবল একই শিরোনামটি যুক্ত করতে চান তবে যে কোনও কোডিংয়ের মাধ্যমে আপনি এটি করতে পারেন!
আপনার ক্লায়েন্ট কনফিগারেশনের ফাইলের এন্ডপয়েন্ট পয়েন্টের নীচে প্রয়োজনীয় হেডারগুলির সাথে কেবল শিরোনাম নোড যুক্ত করুন

<client>  
  <endpoint address="http://localhost/..." >  
    <headers>  
      <HeaderName>Value</HeaderName>  
    </headers>   
 </endpoint>  

18
এগুলি হ'ল এসওএপি শিরোলেখ ( আলাMessageHeader ) - HTTP শিরোনাম নয়।
স্লিভারনিঞ্জা - এমএসএফটি

18

ChannelFactoryপ্রক্সি হিসাবে আপনার ক্লায়েন্ট ডাব্লুসিএফ অনুরোধটিতে ম্যানুয়ালি কাস্টম এইচটিটিপি শিরোনাম যুক্ত করার জন্য এখানে আরেকটি সহায়ক সমাধান । এটি প্রতিটি অনুরোধের জন্য করতে হবে, তবে আপনাকে যদি নন-নেট প্ল্যাটফর্মের প্রস্তুতির জন্য আপনার প্রক্সি পরীক্ষা করার প্রয়োজন হয় তবে একটি সাধারণ ডেমো হিসাবেই যথেষ্ট।

// create channel factory / proxy ...
using (OperationContextScope scope = new OperationContextScope(proxy))
{
    OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = new HttpRequestMessageProperty()
    {
        Headers = 
        { 
            { "MyCustomHeader", Environment.UserName },
            { HttpRequestHeader.UserAgent, "My Custom Agent"}
        }
    };    
    // perform proxy operations... 
}

1
আমি অনুরূপ দেখতে 4 টি অন্যান্য অনুরোধ প্রস্তাব দিয়েছি এবং এটি কেবলমাত্র আমার জন্য কাজ করেছে।
জনঅপিনিকার

এটি আসলে এইচটিটিপি শিরোনাম যোগ করে, ধন্যবাদ! :) তবে জিৎ এটি কুৎসিত কোড দেখাচ্ছে।
br3nt

11

এটি নিমসডটনেট উত্তরের অনুরূপ তবে প্রোগ্রামিয়ালি কীভাবে এটি করা যায় তা দেখায়।

বাইন্ডিংয়ে কেবল শিরোনাম যুক্ত করুন

var cl = new MyServiceClient();

var eab = new EndpointAddressBuilder(cl.Endpoint.Address);

eab.Headers.Add( 
      AddressHeader.CreateAddressHeader("ClientIdentification",  // Header Name
                                         string.Empty,           // Namespace
                                         "JabberwockyClient"));  // Header Value

cl.Endpoint.Address = eab.ToEndpointAddress();

আমি এই কোডটি আমার বর্তমান কলটিতে (ক্লায়েন্টের দিকে) যুক্ত করেছি .. আমি কীভাবে এই সিস্টেমে এই মূল্য পেতে পারি? সার্ভিসমোডেল.অপেশনেশন কনটেক্সট? (সার্ভার সাইড) (আমি আমার আঙ্গুলগুলি পার করছি যা এটি আমাকে সাহায্য করবে)
গ্রানাডা কোডার

1
বুঝেছি ! সিস্টেম.সেসওয়ারমোডেল.চ্যানেলস.মেসেজহাইডার্স শিরোনাম = অপারেশনকন্টেক্সট.রেকুয়েস্টকন্টেক্সট.রেকুয়েস্টমেসেজ.হিডার্স; int headerIndex = headers.FindHeader ("ক্লায়েন্টআইডেন্টিফিকেশন", স্ট্রিং.এম্পটি); var অনুরোধনাম = (শিরোলেখ সূচি <0)? "অজানা": শিরোনামগুলি etGetHeader <স্ট্রিং> (শিরোনাম);
গ্রানাডা কোডার 21

1
@ গ্রানাডা কোডার আমি সেই সাইটটি ভালবাসি! ;-)
gaমেগামান

এটি এসওএপি খামে একটি শিরোনাম যুক্ত করে, কোনও এইচটিটিপি শিরোনাম নয়
br3nt

5
var endpoint = new EndpointAddress(new Uri(RemoteAddress),
               new[] { AddressHeader.CreateAddressHeader(
                       "APIKey", 
                       "",
                       "bda11d91-7ade-4da1-855d-24adfe39d174") 
                     });

12
এটি একটি SOAP বার্তা শিরোনাম, কোনও HTTP শিরোনাম নয়।
রেনি

3

এটি আমার পক্ষে কাজ করেছে, ডাব্লুসিএফ কলগুলিতে এইচটিটিপি শিরোনাম যুক্ত করা থেকে অভিযোজিত

// Message inspector used to add the User-Agent HTTP Header to the WCF calls for Server
public class AddUserAgentClientMessageInspector : IClientMessageInspector
{
    public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, IClientChannel channel)
    {
        HttpRequestMessageProperty property = new HttpRequestMessageProperty();

        var userAgent = "MyUserAgent/1.0.0.0";

        if (request.Properties.Count == 0 || request.Properties[HttpRequestMessageProperty.Name] == null)
        {
            var property = new HttpRequestMessageProperty();
            property.Headers["User-Agent"] = userAgent;
            request.Properties.Add(HttpRequestMessageProperty.Name, property);
        }
        else
        {
            ((HttpRequestMessageProperty)request.Properties[HttpRequestMessageProperty.Name]).Headers["User-Agent"] = userAgent;
        }
        return null;
    }

    public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
    {
    }
}

// Endpoint behavior used to add the User-Agent HTTP Header to WCF calls for Server
public class AddUserAgentEndpointBehavior : IEndpointBehavior
{
    public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
    {
        clientRuntime.MessageInspectors.Add(new AddUserAgentClientMessageInspector());
    }

    public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
    {
    }

    public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
    {
    }

    public void Validate(ServiceEndpoint endpoint)
    {
    }
}

এই ক্লাসগুলি ঘোষণা করার পরে আপনি আপনার ডাব্লুসিএফ ক্লায়েন্টের সাথে নতুন আচরণটি যুক্ত করতে পারেন:

client.Endpoint.Behaviors.Add(new AddUserAgentEndpointBehavior());

এটি সংকলন করবে না: ত্রুটি CS0136 'সম্পত্তি' নামের স্থানীয় বা প্যারামিটারটি এই সুযোগে ঘোষণা করা যায় না কারণ সেই নামটি স্থানীয় বা পরামিতি সংজ্ঞায়িত করার জন্য একটি স্থানীয় স্থানীয় স্কোপগুলিতে ব্যবহৃত হয়।
লেসেক পি পি

কেবল ব্যবহৃত হয়নি
এমনটি

3

এটি আমার পক্ষে কাজ করে

TestService.ReconstitutionClient _serv = new TestService.TestClient();

using (OperationContextScope contextScope = new OperationContextScope(_serv.InnerChannel))
{
   HttpRequestMessageProperty requestMessage = new HttpRequestMessageProperty();

   requestMessage.Headers["apiKey"] = ConfigurationManager.AppSettings["apikey"]; 
   OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = 
      requestMessage;
   _serv.Method(Testarg);
}

2

.NET 3.5 এ প্রসঙ্গে বাইন্ডিংগুলি কেবল আপনি যা খুঁজছেন তা হতে পারে। বাক্সের বাইরে তিনটি রয়েছে: বেসিকহট্টপ্যাক্টেক্সটবাইন্ডিং, নেটটিসপিসিঙ্কটেক্সট বাইন্ডিং, এবং ডাব্লুএসএইচটিটিপি কনটেক্সটবাইন্ডিং। প্রসঙ্গত প্রোটোকল মূলত বার্তা শিরোনামে মূল-মান জোড়া পাস করে। এমএসডিএন ম্যাগাজিনে টেকসই পরিষেবাদি নিবন্ধ সহ ম্যানেজিং স্টেটটি দেখুন ।


এছাড়াও নোট করুন যে আপনি সার্ভারের সাথে একটি সেশন স্থাপনের আগে একবার প্রসঙ্গটি সেট করেছেন। তারপরে প্রসঙ্গটি পাঠযোগ্য হয়ে যায়। আপনি যদি ক্লায়েন্টের পক্ষ থেকে প্রসঙ্গ সেটআপটি স্বচ্ছ হতে চান তবে আপনি ক্লায়েন্ট প্রক্স্ট ক্লাস থেকে শুরু করতে পারেন এবং পরিচালক হিসাবে আপনি আপনার প্রসঙ্গ তৈরির তথ্য যুক্ত করতে পারেন। তারপরে প্রতিবার ক্লায়েন্ট ক্লায়েন্ট প্রক্সটির উদাহরণ তৈরি করলে, প্রসঙ্গটি স্বয়ংক্রিয়ভাবে তৈরি হয়ে ক্লায়েন্ট প্রক্সি উদাহরণে যুক্ত হবে।
মেহমেট আরস

2

যদি আমি আপনার প্রয়োজনীয়তাটি সঠিকভাবে বুঝতে পারি তবে সহজ উত্তরটি: আপনি পারবেন না।

এর কারণ হ'ল ডাব্লুসিএফ পরিষেবার ক্লায়েন্টটি আপনার পরিষেবা ব্যবহার করে এমন কোনও তৃতীয় পক্ষের দ্বারা উত্পন্ন হতে পারে।

যদি আপনার পরিষেবার ক্লায়েন্টদের নিয়ন্ত্রণ থাকে তবে আপনি একটি বেস ক্লায়েন্ট শ্রেণি তৈরি করতে পারেন যা পছন্দসই শিরোনাম যুক্ত করে এবং শ্রমিক শ্রেণিতে আচরণের উত্তরাধিকারী।


1
সম্মত, আপনি যদি সত্যই এসওএ তৈরি করে থাকেন তবে আপনি ধরে নিতে পারবেন না যে সমস্ত ক্লায়েন্টগুলি নেট ভিত্তিক। আপনার ব্যবসাটি অর্জিত না হওয়া পর্যন্ত অপেক্ষা করুন।
স্লিভারনিঞ্জা - এমএসএফটি

2
এটা কি সত্যি? জাভা ওয়েব পরিষেবা ক্লায়েন্টদের এসওএপি শিরোনামে নাম / মান যুক্ত করার ক্ষমতা নেই? আমি দেখলাম এটাতে বিশ্বাস করা কঠিন. অবশ্যই এটি অন্যরকম বাস্তবায়ন হবে, তবে এটি একটি ইন্টারঅ্যাপেবল সমাধান
অ্যাডাম 20 ই

2

আপনি ম্যাসেজকন্ট্রাক্টে কাস্টম শিরোনাম নির্দিষ্ট করতে পারেন ।

আপনি <শেষ পয়েন্ট> শিরোনামগুলিও ব্যবহার করতে পারেন যা কনফিগারেশন ফাইলে সংরক্ষিত থাকে এবং ক্লায়েন্ট / পরিষেবাদি দ্বারা প্রেরিত সমস্ত বার্তার শিরোনামে সর্বদা অনুলিপি করা হবে। সহজেই কিছু স্থির শিরোনাম যুক্ত করতে এটি দরকারী।


3
এগুলি হ'ল এসওএপি শিরোলেখ ( আলাMessageHeader ) - HTTP শিরোনাম নয়।
স্লিভারনিঞ্জা - এমএসএফটি

0

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

মার্ক গুডস এবং পলভাইটের উত্তরের মতোই IClientMessageInspectorআমাদের ডাব্লুসিএফ অনুরোধে কাস্টম এইচটিটিপি শিরোনাম ইনজেক্ট করার জন্য সাবক্লাস প্রয়োজন । তবে, আমরা যে শিরোনাম যুক্ত করতে চাই সেগুলি সহ একটি অভিধান গ্রহণ করে পরিদর্শকটিকে আরও জেনেরিক করে তুলি:

public class HttpHeaderMessageInspector : IClientMessageInspector
{
    private Dictionary<string, string> Headers;

    public HttpHeaderMessageInspector(Dictionary<string, string> headers)
    {
        Headers = headers;
    }

    public object BeforeSendRequest(ref Message request, IClientChannel channel)
    {
        // ensure the request header collection exists
        if (request.Properties.Count == 0 || request.Properties[HttpRequestMessageProperty.Name] == null)
        {
            request.Properties.Add(HttpRequestMessageProperty.Name, new HttpRequestMessageProperty());
        }

        // get the request header collection from the request
        var HeadersCollection = ((HttpRequestMessageProperty)request.Properties[HttpRequestMessageProperty.Name]).Headers;

        // add our headers
        foreach (var header in Headers) HeadersCollection[header.Key] = header.Value;

        return null;
    }

    // ... other unused interface methods removed for brevity ...
}

মার্ক গুডস এবং পলভাইটের উত্তরের মতোই IEndpointBehaviorআমাদের HttpHeaderMessageInspectorআমাদের ডাব্লুসিএফ ক্লায়েন্টে ইনজেকশন দেওয়ার জন্য সাবক্লাস প্রয়োজন ।

public class AddHttpHeaderMessageEndpointBehavior : IEndpointBehavior
{
    private IClientMessageInspector HttpHeaderMessageInspector;

    public AddHttpHeaderMessageEndpointBehavior(Dictionary<string, string> headers)
    {
        HttpHeaderMessageInspector = new HttpHeaderMessageInspector(headers);
    }

    public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
    {
        clientRuntime.ClientMessageInspectors.Add(HttpHeaderMessageInspector);
    }

    // ... other unused interface methods removed for brevity ...
}

আমাদের অবজেক্ট অরিয়েন্টেড পদ্ধতির সমাপ্তির জন্য শেষ অংশটি হ'ল আমাদের ডাব্লুসিএফ অটো-জেনারেট ক্লায়েন্টের একটি সাবক্লাস তৈরি করা (আমি ডাব্লুসিএফ ক্লায়েন্ট তৈরির জন্য মাইক্রোসফ্টের ডাব্লুসিএফ ওয়েব পরিষেবা রেফারেন্স গাইড ব্যবহার করেছি )।

আমার ক্ষেত্রে, আমাকে x-api-keyএইচটিএমএল শিরোনামের সাথে একটি এপিআই কী সংযুক্ত করতে হবে ।

সাবক্লাসটি নিম্নলিখিতগুলি করে:

  • বেস বর্গের কনস্ট্রাক্টরকে প্রয়োজনীয় প্যারামিটারগুলি কল করে (আমার ক্ষেত্রে EndpointConfigurationকনস্ট্রাক্টরে প্রবেশের জন্য একটি এনাম তৈরি হয়েছিল - সম্ভবত আপনার বাস্তবায়নে এটি থাকবে না)
  • শিরোনামগুলি সংজ্ঞায়িত করে যা প্রতিটি অনুরোধের সাথে সংযুক্ত করা উচিত
  • সংযুক্ত AddHttpHeaderMessageEndpointBehaviorক্লায়েন্টের কাছে Endpointআচরণে
public class Client : MySoapClient
{
    public Client(string apiKey) : base(EndpointConfiguration.SomeConfiguration)
    {
        var headers = new Dictionary<string, string>
        {
            ["x-api-key"] = apiKey
        };

        var behaviour = new AddHttpHeaderMessageEndpointBehavior(headers);
        Endpoint.EndpointBehaviors.Add(behaviour);
    }
}

অবশেষে, আপনার ক্লায়েন্ট ব্যবহার করুন!

var apiKey = 'XXXXXXXXXXXXXXXXXXXXXXXXX';
var client = new Client (apiKey);
var result = client.SomeRequest()

ফলাফলের এইচটিটিপি অনুরোধে আপনার এইচটিটিপি শিরোনাম থাকা উচিত এবং এর মতো কিছু দেখতে হবে:

POST http://localhost:8888/api/soap HTTP/1.1
Cache-Control: no-cache, max-age=0
Connection: Keep-Alive
Content-Type: text/xml; charset=utf-8
Accept-Encoding: gzip, deflate
x-api-key: XXXXXXXXXXXXXXXXXXXXXXXXX
SOAPAction: "http://localhost:8888/api/ISoapService/SomeRequest"
Content-Length: 144
Host: localhost:8888

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Body>
    <SomeRequestxmlns="http://localhost:8888/api/"/>
  </s:Body>
</s:Envelope>

-1

পার্টিতে কিছুটা দেরি হলেও জুভাল লোই তাঁর বই এবং সম্পর্কিত সার্ভিস মডেলএক্স লাইব্রেরিতে এই হুবহু দৃশ্যের দিকে নজর দেন

মূলত তিনি ক্লায়েন্টবেস এবং চ্যানেলফ্যাক্টরী বিশেষত্বগুলি সংজ্ঞায়িত করেন যা টাইপ-নিরাপদ শিরোলেখের মানগুলি নির্দিষ্ট করে allow আমি উত্সটি ডাউনলোড করার এবং হেডারক্লিয়েন্টবেস এবং হেডারচ্যানেলফ্যাক্টরি ক্লাসগুলি দেখার পরামর্শ দিচ্ছি।

জন


1
এটি কারও কাজের প্রচার ব্যতীত কিছুই নয়। আপনি কি কোনও প্রাসঙ্গিক অংশ / অ্যালগরিদম যুক্ত করতে পারেন - অর্থাত্ প্রশ্নের উত্তর দিন - বা আপনার কোনও অনুমোদিততা প্রকাশ করতে পারেন? অন্যথায় এটি কেবল ফ্যানসিড স্প্যাম।
মনিকার লসুইট

আমি বলব যে এটি কাউকে একটি পয়েন্টারটির মাধ্যমে এমন কোনও পদ্ধতির উত্তর দিচ্ছে যার বিষয়ে তারা অবগত নয়। আমি প্রাসঙ্গিক লিঙ্কটি দিয়েছি কেন আমাকে আরও যুক্ত করা দরকার? এটা সব উল্লেখ আছে। এবং আমি নিশ্চিত যে জুভাল লোই এর চেয়ে বেশি ভালো বর্ণনা করতে পেরেছিলাম :-) আমার সংযুক্তি হিসাবে - আমি বইটি কিনেছি! এটাই. মিঃ লোয়ের সাথে আমি কখনও সাক্ষাত করতে পারি নি তবে আমি নিশ্চিত যে তিনি দুর্দান্ত এক চ্যাপ্টা। আপাতদৃষ্টিতে ডাব্লুসিএফ সম্পর্কে অনেক কিছু জানে ;-)
ব্রিজলওল

আপনার আরও যুক্ত করা উচিত কারণ সম্ভবত আপনি উত্তর দেওয়ার আগে কীভাবে উত্তর দেবেন তা পড়েছিলেন এবং আপনি যে অংশটি লক্ষ্য করেছেন তা উল্লেখ করেছেন "টার্গেট সাইটটি অ্যাক্সেসযোগ্য না হলে বা স্থায়ীভাবে অফলাইনে চলে যাওয়ার ক্ষেত্রে" একটি গুরুত্বপূর্ণ লিঙ্কের সর্বাধিক প্রাসঙ্গিক অংশটি সর্বদা উদ্ধৃত করুন। " আপনার অধিভুক্তি গুরুত্বপূর্ণ নয়। কেবলমাত্র উত্তরের গুণমান।
মনিকার লসুইট

ফাইন। আমি এতে পয়েন্টগুলির জন্য নেই - আপনি সম্ভবত আমার স্কোর থেকে বলতে পারেন! ভেবেছি এটি একটি দরকারী পয়েন্টার হতে পারে।
BrizzleOwl

1
আমি এটি খারাপ পয়েন্টার বলছি না। আমি নিজেই বলছি যে এটি কোনও ভাল উত্তর নয়। এটি খুব ভালভাবে লোকদের সহায়তা করতে পারে এবং এটি একটি ভাল জিনিস, তবে জড়িত শ্রেণীর একটি খুব সংক্ষিপ্ত বিবরণ দেওয়ার পরিবর্তে আপনি যদি তিনি যে পদ্ধতিটি ব্যবহার করছেন তা বর্ণনা করতে পারলে উত্তরটি আরও ভাল হবে। এইভাবে, এই উপলক্ষে সাইটটি অ্যাক্সেস করা যায় না - যে কোনও কারণেই - আপনার উত্তরটি এখনও সহায়তা করে।
মনিকার লসুইট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.