मुझे आश्चर्य है कि अतिरिक्त संदेश ले जाने के लिए आउटगोइंग अनुरोध को आउटपुट करने के लिए कस्टम संदेश हेडर इंजेक्ट करना संभव है, जैसे कि प्रमाणीकरण, प्रमाणीकरण या अनुरोध के सहसंबंध जैसे पूर्णता को पूरा करने के लिए पेलोड को बेकार करने के लिए संदेश प्रेषक के माध्यम से प्रदान किया गया है?Azure सेवा कपड़े के डिफ़ॉल्ट क्लाइंट का उपयोग करते समय अनुरोध में संदेश शीर्षलेख कैसे जोड़ें?
उत्तर
अद्यतन
SDK v2 के साथ अब आप (अपेक्षाकृत) आसानी से दोनों विश्वसनीय सेवा और अभिनेता के शीर्ष लेख संशोधित कर सकते हैं। नीचे दिए गए उदाहरणों में नोट कुछ रैपर सदस्यों को अल्पसंख्यक के लिए छोड़ दिया गया था।
ग्राहक
हम ServiceProxyFactory
का उपयोग स्थिर ServiceProxy
के बजाय प्रॉक्सी बनाने के लिए। फिर हम IServiceRemotingClientFactory
और IServiceRemotingClient
लपेट सकते हैं और सेवा कॉल को रोक सकते हैं। यह ActorProxyFactory
के साथ किया जा सकता है। ध्यान दें कि यह WcfServiceRemotingProviderAttribute
जैसे गुणों के व्यवहार को ओवरराइड करता है, क्योंकि हम स्पष्ट रूप से क्लाइंट फैक्ट्री को निर्दिष्ट करते हैं।
_proxyFactory = new ServiceProxyFactory(c => new ServiceRemotingClientFactoryWrapper(
// we can use any factory here
new WcfServiceRemotingClientFactory(callbackClient: c)));
private class ServiceRemotingClientFactoryWrapper : IServiceRemotingClientFactory
{
private readonly IServiceRemotingClientFactory _inner;
public ServiceRemotingClientFactoryWrapper(IServiceRemotingClientFactory inner)
{
_inner = inner;
}
public async Task<IServiceRemotingClient> GetClientAsync(Uri serviceUri, ServicePartitionKey partitionKey, TargetReplicaSelector targetReplicaSelector,
string listenerName, OperationRetrySettings retrySettings, CancellationToken cancellationToken)
{
var client = await _inner.GetClientAsync(serviceUri, partitionKey, targetReplicaSelector, listenerName, retrySettings, cancellationToken).ConfigureAwait(false);
return new ServiceRemotingClientWrapper(client);
}
}
private class ServiceRemotingClientWrapper : IServiceRemotingClient
{
private readonly IServiceRemotingClient _inner;
public ServiceRemotingClientWrapper(IServiceRemotingClient inner)
{
_inner = inner;
}
public Task<byte[]> RequestResponseAsync(ServiceRemotingMessageHeaders messageHeaders, byte[] requestBody)
{
// use messageHeaders.AddHeader() here
return _inner.RequestResponseAsync(messageHeaders, requestBody);
}
public void SendOneWay(ServiceRemotingMessageHeaders messageHeaders, byte[] requestBody)
{
// use messageHeaders.AddHeader() here
_inner.SendOneWay(messageHeaders, requestBody);
}
}
सर्वर
इनहेरिट ServiceRemotingDispatcher
और ActorServiceRemotingDispatcher
से हेडर जांच करने के लिए।
class CustomServiceRemotingDispatcher : ServiceRemotingDispatcher
{
public override async Task<byte[]> RequestResponseAsync(IServiceRemotingRequestContext requestContext, ServiceRemotingMessageHeaders messageHeaders, byte[] requestBody)
{
// read messageHeaders here
// or alternatively put them in an AsyncLocal<T> scope
// so they can be accessed down the call chain
return base.RequestResponseAsync(requestContext, messageHeaders, requestBody);
}
}
इस वर्ग का उपयोग करने के लिए, फिर से हम सीधे संचार श्रोता बनाकर ServiceRemotingProviderAttribute
ओवरराइड करने के लिए की जरूरत है:
class MyService : StatelessService
{
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
yield return new ServiceInstanceListener(context => new WcfServiceRemotingListener(context, new CustomServiceRemotingDispatcher());
}
}
मैंने कुछ हफ्ते पहले the same question on the MSDN forum से पूछा, हालांकि मुझे वहां कोई प्रतिक्रिया नहीं मिली।
मैंने क्लाइंट लाइब्रेरी के स्रोत कोड में देखा और हेडर जोड़ने का कोई तरीका नहीं मिला है। मुझे डर है कि विधि कॉल के हिस्से के रूप में उन्हें जोड़ने का एकमात्र तरीका है। यह अनुरोध-वर्गों को विधि पैरामीटर के रूप में और उनके लिए विरासत का उपयोग करके किया जा सकता है। (उदा। हेडर्स के साथ RequestBase क्लास [प्रमाणीकरण, क्लाइंटइन्फो, ...])। फिर आपको यह सुनिश्चित करना होगा कि ये हेडर सभी आमंत्रणों को लपेटकर या मैन्युअल रूप से सेट करके प्रत्येक अनुरोध के लिए सेट हैं।
सेवा फैब्रिक टीम से और स्पष्टीकरण की सराहना की जाएगी।
कहाँ आईडी आप ग्राहक स्रोत कोड नहीं मिल रहा? मैंने एपीआई की जांच की, एक सेवा रीमोटिंग हैडर क्लास है जो मुझे सोचती है कि आउटगोइंग अनुरोध में कस्टम हेडर जोड़ने के तरीके हैं। इसके अलावा, क्लाइंट संचार करने के लिए डब्ल्यूसीएफ का उपयोग करना प्रतीत होता है। यदि हां, तो डेवलपर को संदेश प्रेषक का पर्दाफाश करना संभव होना चाहिए। – Xiangdong
@Xiangdong मैंने ILSpy के साथ Microsoft.ServiceFabric.Services.dll को देखा। सेवा रिमोटिंग हैडर जाने का रास्ता प्रतीत होता है, हां। हालांकि मुझे उन्हें बाहर से सेट करने का कोई तरीका नहीं मिला है। मुझे लगता है कि ServiceProxy.InvokeAsync() वह जगह है जो अनुरोध शुरू करती है और यह सेवा रीमोटिंग मैसेज हैडर-वेरिएबल आंतरिक रूप से बनाता है और इसे डाउनस्ट्रीम सर्विस पार्टिशन क्लाइंट में भेजती है। लेकिन शायद मुझे कुछ याद आया ... –
- 1. डब्ल्यूसीएफ अनुरोध सुरक्षा के लिए शीर्षलेख जोड़ें टोकन संदेश
- 2. डिफ़ॉल्ट एचटीटीपी क्लाइंट का उपयोग करते समय मैं सभी HTTP शीर्षलेख कैसे प्रदर्शित कर सकता हूं?
- 3. Azure सेवा बस कतार संदेश
- 4. Hiveserver2 Thrift Java क्लाइंट का उपयोग करते समय अनुरोध लटका
- 5. ग्लैड का उपयोग करते समय नोटबुक में टैब कैसे जोड़ें?
- 6. एक SOAP संदेश में सुरक्षा शीर्षलेख कैसे जोड़ें?
- 7. सेवा कपड़े
- 8. मल्टी-थ्रेडिंग का उपयोग करते समय सूची में कैसे जोड़ें?
- 9. wcf में कस्टम साबुन शीर्षलेख कैसे जोड़ें?
- 10. RabbitMQ के Erlang क्लाइंट में संदेश शीर्षलेख का उपयोग कैसे करें?
- 11. एंड्रॉइड पर डिफ़ॉल्ट एचटीपी क्लाइंट के साथ HttpPost का उपयोग करते समय प्रमाणीकरण त्रुटि
- 12. Azure सेवा फैब्रिक और संदेश कतार
- 13. क्लाउडफ़्रंट का उपयोग करते समय, वर्तमान दिनांक के सापेक्ष समाप्ति शीर्षलेख कैसे सेट कर सकता है?
- 14. RSpec अनुरोध चश्मा में Capybara का उपयोग करते समय कस्टम अनुरोध शीर्षलेख सेट करने का सबसे अच्छा तरीका क्या है?
- 15. कॉर्डोवा कमांड का उपयोग करते समय लाइव रीलोड कैसे जोड़ें?
- 16. Robolectric 2.2 का उपयोग करते समय छाया वर्ग कैसे जोड़ें?
- 17. एज़ूर वेबसाइट सेवा में डिफ़ॉल्ट समय क्षेत्र को कैसे बदलें?
- 18. वेब क्लाइंट अनुरोध के साथ क्रिया का उपयोग कैसे करें?
- 19. सेवा कपड़े पर एप्लिकेशन कैसे ब्राउज़ करें?
- 20. बेसिक एथ का उपयोग करते समय HTTP क्लाइंट दो अनुरोध भेजता है?
- 21. आप Azure सेवा बस विभाजित कतार/विषयों के साथ FIFO संदेश ऑर्डरिंग का समर्थन कैसे करते हैं?
- 22. HTTPie का उपयोग करते समय अनुरोध कैसे मुद्रित करें?
- 23. जावा में SOAP अनुरोध शीर्षलेख कैसे भेजें?
- 24. प्रॉक्सी वेब सेवा क्लाइंट उत्पन्न करने के लिए जैक्स का उपयोग करते समय त्रुटि
- 25. क्रोम कस्टम टैब का उपयोग करते समय कस्टम अनुरोध शीर्षलेख जोड़ना संभव है?
- 26. संदेश शीर्षलेख मान
- 27. का उपयोग करते समय @require_POST
- 28. स्विफ्ट में अलामोफायर का उपयोग करते समय प्रतिक्रिया शीर्षलेख कैसे प्राप्त करें?
- 29. कपड़े के काम में कस्टम सजावट कैसे जोड़ें
- 30. डब्ल्यूसीएफ सेवा के अनुरोध निष्पादन समय को सीमित कैसे करें?
मैं एक ही दिशा में जा रहा हूं, आपका कोड उदाहरण निश्चित मदद बहुत है। लेकिन मैं अभी भी चाहता हूं कि माइक्रोसॉफ्ट ऐसे उपयोग मामलों को सक्षम करने के लिए एक ही संदेश हैंडलर तंत्र प्रदान करता है। – Xiangdong
ServiceInstanceListener में WcfServiceRemotingListener के समान प्रेषक के लिए कन्स्ट्रक्टर पैरामीटर नहीं है। रिमोटिंग का उपयोग करते समय कोई प्रेषक कैसे जोड़ सकता है? – SondreB
समस्या यह है कि ServiceInstanceListener ICommunicationListener लेता है और IServiceRemotingMessageHandler नहीं, और उस इंटरफ़ेस में ऐसे तरीके नहीं हैं जो संदेश शीर्षलेख लौटाते हैं। – SondreB