উত্তর:
আপনি এই ত্রুটিটি পেয়েছেন কারণ আপনি আপনার সার্ভারের দিক থেকে একটি .NET ব্যতিক্রম ঘটতে দিয়েছিলেন এবং আপনি এটি ধরেন এবং পরিচালনা করেননি এবং এটি একটি SOAP দোষে রূপান্তর করেন নি।
সার্ভার সাইডটি "বোমাবর্ষণ" করার পরে, ডাব্লুসিএফ রানটাইম চ্যানেলটিকে "ফল্ট" করেছে - যেমন ক্লায়েন্ট এবং সার্ভারের মধ্যে যোগাযোগের লিঙ্কটি ব্যবহারযোগ্য নয় - সর্বোপরি, এটি দেখতে আপনার সার্ভারটি ঠিক ফুঁড়ে উঠেছে, সুতরাং আপনি তার সাথে যোগাযোগ করতে পারবেন না এটা আর।
সুতরাং আপনার যা করা দরকার তা হ'ল:
সর্বদা আপনার সার্ভারের পাশের ত্রুটিগুলি ধরুন এবং পরিচালনা করুন - .NET ব্যতিক্রমগুলি সার্ভার থেকে ক্লায়েন্টের কাছে ভ্রমণ করতে দেবেন না - সর্বদা আন্তঃযোগযোগ্য এসওএপি ফল্টগুলিতে মোড়ানো। ডাব্লুসিএফ আইরিরহ্যান্ডলার ইন্টারফেসটি দেখুন এবং এটি সার্ভারের পাশেই প্রয়োগ করুন
আপনি যদি ক্লায়েন্টের কাছ থেকে আপনার চ্যানেলে দ্বিতীয় বার্তা প্রেরণ করতে চলেছেন তবে নিশ্চিত হয়ে নিন যে চ্যানেলটি ত্রুটিযুক্ত অবস্থায় নেই:
if(client.InnerChannel.State != System.ServiceModel.CommunicationState.Faulted)
{
// call service - everything's fine
}
else
{
// channel faulted - re-create your client and then try again
}
যদি এটি হয় তবে আপনি যা করতে পারেন তা হ'ল এটি নিষ্পত্তি করে আবার ক্লায়েন্টের পাশের প্রক্সিটি তৈরি করুন এবং তারপরে আবার চেষ্টা করুন
সার্ভারকে ফল্ট অবস্থায় পড়ার হাত থেকে রক্ষা করতে আপনাকে অবশ্যই নিশ্চিত করতে হবে যে কোনওরকম নিয়ন্ত্রণহীন ব্যতিক্রম উত্থাপিত না হয়। যদি ডাব্লুসিএফ অপ্রত্যাশিত ব্যতিক্রম দেখে, আর কোনও কল গৃহীত হবে না - প্রথমে সুরক্ষা।
এই আচরণটি এড়াতে দুটি সম্ভাবনা:
ফল্ট এক্সসেপশন ব্যবহার করুন (এটি ডাব্লুসিএফের জন্য অপ্রত্যাশিত নয়, তাই ডাব্লুসিএফ জানে যে সার্ভারটির এখনও একটি বৈধ রাষ্ট্র রয়েছে)
পরিবর্তে
throw new Exception("Error xy in my function")
সর্বদা ব্যবহার করুন
throw new FaultException("Error xy in my function")
সম্ভবত আপনি চেষ্টা করতে পারেন। সম্পূর্ণ ব্লকটি ধরুন এবং একটি ব্যতিক্রমের সমস্ত ক্ষেত্রে একটি ফল্ট এক্সসেপশন নিক্ষেপ করতে পারেন
try
{
... some code here
}
catch (Exception ex)
{
throw new FaultException(ex.Message)
}
ডাব্লুসিএফকে একটি ত্রুটিযুক্তর ব্যবহার করে সমস্ত ব্যতিক্রম পরিচালনা করতে বলুন। এটি বিভিন্ন উপায়ে করা যেতে পারে, আমি একটি অ্যাট্রিবিউট ব্যবহার করে একটি সাধারণকে বেছে নিয়েছিলাম:
আমাদের আরও বেশি কিছু করতে হবে, হ'ল [SvcErrorHandlerBehaviour]
পরিষেবা বাস্তবায়নের বৈশিষ্ট্যটি ব্যবহার করা is
using System;
using System.Collections.ObjectModel;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;
using System.ServiceModel.Dispatcher;
namespace MainService.Services
{
/// <summary>
/// Provides FaultExceptions for all Methods Calls of a Service that fails with an Exception
/// </summary>
public class SvcErrorHandlerBehaviourAttribute : Attribute, IServiceBehavior
{
public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{ } //implementation not needed
public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints,
BindingParameterCollection bindingParameters)
{ } //implementation not needed
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
foreach (ChannelDispatcherBase chanDispBase in serviceHostBase.ChannelDispatchers)
{
ChannelDispatcher channelDispatcher = chanDispBase as ChannelDispatcher;
if (channelDispatcher == null)
continue;
channelDispatcher.ErrorHandlers.Add(new SvcErrorHandler());
}
}
}
public class SvcErrorHandler: IErrorHandler
{
public bool HandleError(Exception error)
{
//You can log th message if you want.
return true;
}
public void ProvideFault(Exception error, MessageVersion version, ref Message msg)
{
if (error is FaultException)
return;
FaultException faultException = new FaultException(error.Message);
MessageFault messageFault = faultException.CreateMessageFault();
msg = Message.CreateMessage(version, messageFault, faultException.Action);
}
}
}
এটি একটি সহজ উদাহরণ, আপনি উলঙ্গ ব্যবহার না করে আইরির হ্যান্ডলারের আরও গভীর দিকে ডুব দিতে পারেন FaultException
, তবে এমন FaultException<>
একটি ধরণের যা অতিরিক্ত তথ্য সরবরাহ করে একটি বিস্তারিত উদাহরণের জন্য আইরিরহ্যান্ডলার দেখুন ।
প্রকৃতপক্ষে, যদি marc_s এর পরামর্শ অনুসরণের পরে ব্যর্থ হয় , তবে দয়া করে মনে রাখবেন যে সার্ভারের ওয়েবকন্টিফাইজে সার্ভার বাইন্ডিং কনফিগারেশনের একটি <সুরক্ষা> উপাদানটি এই ব্যতিক্রমের কারণ হতে পারে। উদাহরণস্বরূপ সার্ভারটি প্রত্যাশিত- Message
সর্বমানের সুরক্ষা এবং ক্লায়েন্টটি কনফিগার করা হয়েছে None
(বা, যদি সার্ভারটি একটি অ্যাক্টিভ ডিরেক্টরি ডোমেনির অংশ না হয় তবে দূরবর্তী ক্লায়েন্ট হোস্ট হয়)।
পরামর্শ: আরডিপি সেশনে প্রশাসনিক অ্যাকাউন্টের অধীনে সরাসরি সার্ভার মেশিনে মৃত্যুদন্ড কার্যকর করা হলে ক্লায়েন্ট অ্যাপ্লিকেশন সম্ভবত ওয়েব পরিষেবাটিকে সূক্ষ্মভাবে ডেকে আনবে।
এই সমস্যাটি সনাক্ত করতে, ভিজ্যুয়াল স্টুডিও ডিবাগারের অধীনে পরিষেবাটি চালান। মেনুটি ব্যবহার করুন: ডিবাগ | ব্যতিক্রম এবং ইঙ্গিত দেয় যে কোনও ব্যতিক্রম ছোঁড়ার সময় আপনি ব্রেক করতে চান।
"..এটি ফল্ট অবস্থায় রয়েছে" এর চেয়ে মূল ব্যতিক্রমটির চেয়ে আরও ভাল ত্রুটির বার্তা থাকবে।
উদাহরণস্বরূপ আমি সার্ভিস হোস্ট থেকে এই ব্যতিক্রমটি পেয়েছিলাম Oপেন (), কিন্তু যখন আমি এটি নিক্ষেপ করার সময় মূল ব্যতিক্রমটি ধরলাম তখন ত্রুটি বার্তাটি ছিল:
পরিষেবা 'মাই সার্ভিসনাম' এর শূন্য অ্যাপ্লিকেশন (অবকাঠামোহীন) শেষ পয়েন্ট রয়েছে। এটি হতে পারে কারণ আপনার অ্যাপ্লিকেশনটির জন্য কোনও কনফিগারেশন ফাইল পাওয়া যায় নি, বা সার্ভিসের নামের সাথে কোনও পরিষেবার উপাদান মেলে এমন কোনও উপাদান উপাদান কনফিগারেশন ফাইলে খুঁজে পাওয়া যায় নি, বা কোনও পরিষেবা বিন্দুতে কোনও শেষ পয়েন্ট সংজ্ঞায়িত করা হয়নি।
App.config এ বানান ত্রুটি ঠিক করা সমস্যার সমাধান করেছে।
একটি নেট এসএমএক্স পরিষেবা নেট.tcp ডাব্লুসিএফ পরিষেবা শেষ পয়েন্ট ব্যবহার করার চেষ্টা করার সময় আমার একই সমস্যা ছিল।
আমি যেমন দেখেছি যে এই সমস্যাটি কেন ঘটছে তা সুনির্দিষ্ট উত্তর কেউ লিখেনি, তবে কীভাবে সঠিকভাবে পরিচালনা করা যায়।
আমি একটানা কয়েক দিন এটির সাথে লড়াই করে যাচ্ছিলাম এবং অবশেষে আমি জানতে পারি যে সমস্যাটি আমার ক্ষেত্রে থেকে আসে।
প্রাথমিকভাবে আমি ভেবেছিলাম যে আপনি যখন কোনও পরিষেবাদির জন্য কোনও রেফারেন্স তৈরি করবেন তখন উত্সের মতোই সুরক্ষা ট্যাগ সম্পর্কিত কনফিগার ফাইলটি কনফিগার করা হবে, তবে এটি ছিল না এবং আমি নিজে এটির যত্ন নেওয়া উচিত। আমার ক্ষেত্রে আমার ছিল
<netTcpBinding>
<binding name="NetTcpBinding_IAuthenticationLoggerService"
</binding>
</netTcpBinding>`
পরে আমি দেখেছি যে সুরক্ষা অংশটি অনুপস্থিত এবং এটি দেখতে এটির মতো হওয়া উচিত
<netTcpBinding>
<binding name="NetTcpBinding_IAuthenticationLoggerService" transferMode="Buffered">
<security mode="None">
<transport clientCredentialType="None"/>
</security>
</binding>
</netTcpBinding>
আমার ক্ষেত্রে দ্বিতীয় সমস্যাটি ছিল আমি ব্যবহার করছি transferMode="Streamed"
আমার সোর্স WCF সেবা এবং ক্লায়েন্ট মধ্যে আমি এটা সম্পর্কে কিছুই নির্দিষ্ট, যা খারাপ হয়েছিল, কারণ ডিফল্ট transferMode
হয় Buffered
এবং এটি একই কনফিগার করা দুটি জায়গাতেই উৎস এবং ক্লায়েন্টের গুরুত্বপূর্ণ উপায়।
আপনি যদি এই বার্তাটি ভিজ্যুয়াল স্টুডিও থেকে ডিবাগ-এ দেখেন এবং সমাধানে ডাব্লুসিএফ প্রকল্প রয়েছে। তারপরে এই ডাব্লুসিএফ প্রকল্প সেটিংসটি খুলুন -> "ডাব্লুসিএফ বিকল্পগুলি" ট্যাবে যান -> "ডাবগিংয়ের সময় ডাব্লুসিএফ পরিষেবা হোস্ট শুরু করুন ..." বিকল্পটি বন্ধ করুন
আমার কাছে সমস্যাটি কনফিগারেশন ফাইলের কারণে ডাব্লুএসডিএল আমদানি করে স্বয়ংক্রিয়ভাবে উত্পন্ন হয়েছিল। আমি বাইন্ডিংটি আপডেট করে বেসিকএইচটিপিবাইন্ডিং থেকে কাস্টমবাইন্ডিংয়ে নিয়েছি। অতিরিক্ত ব্যতিক্রম হ্যান্ডলিং যোগ করা এটি নির্দেশ করে সাহায্য করে না।
আগে
<basicHttpBinding>
<binding name="ServiceName">
<security mode="Transport" />
</binding>
</basicHttpBinding>`
পরে
<customBinding>
<binding name="ServiceName">
<textMessageEncoding messageVersion="Soap12" />
<httpsTransport />
</binding>
</customBinding>`
আমার ক্ষেত্রে কারণটি ছিল কিছু ভুল শংসাপত্র যা লোড করা যায়নি। আমি এটি সিস্টেমের অধীনে ইভেন্ট ভিউয়ারের কাছ থেকে পেয়েছি:
টিএলএস সার্ভারের শংসাপত্রের ব্যক্তিগত কীটি অ্যাক্সেস করার চেষ্টা করার সময় মারাত্মক ত্রুটি ঘটেছে। ক্রিপ্টোগ্রাফিক মডিউল থেকে ফিরে আসা ত্রুটি কোডটি 0x8009030D। অভ্যন্তরীণ ত্রুটির অবস্থা 10001।
এই ত্রুটিটি আপনার নিজের কম্পিউটার দ্বারাও ট্রিগার করা যেতে পারে, এবং কেবল একটি অবিকৃত ব্যতিক্রম নয়। যদি আপনার সার্ভার / কম্পিউটারের ঘড়ির সময়টি খুব বেশি মিনিটের মধ্যে বন্ধ থাকে তবে অনেকগুলি নেট নেট সার্ভিস আপনার অনুরোধটি একটি অনিচ্ছাকৃত ত্রুটির সাথে প্রত্যাখ্যান করবে। এটি তাদের দৃষ্টিকোণ থেকে পরিচালনা করা হয়েছে, তবে আপনার দৃষ্টিকোণ থেকে নিরবচ্ছিন্ন। আপনার প্রাপ্তির সার্ভারের ঘড়ির সময়টি সঠিক কিনা তা পরীক্ষা করে দেখুন। যদি এটি স্থির করার দরকার হয়, আপনাকে চ্যানেলটি পুনরায় চালু হওয়ার আগে আপনার পরিষেবাটি পুনরায় সেট করতে হবে বা পুনরায় বুট করতে হবে।
আমি এই সমস্যাটি এমন একটি সার্ভারে অনুভব করেছি যেখানে ফায়ারওয়াল ইন্টারনেট সময় আপডেট বন্ধ করে দিয়েছিল এবং কোনও কারণে সার্ভারটি সময় বন্ধ করে দিয়েছে। সমস্ত তৃতীয় পক্ষ .NET ওয়েব পরিষেবাদি দোষে পরিণত হয়েছে কারণ তারা কোনও ওয়েব পরিষেবার অনুরোধ প্রত্যাখ্যান করেছে। ইভেন্ট দর্শকের মধ্যে খনন করা সমস্যাটি সনাক্ত করতে সহায়তা করেছিল, তবে ঘড়ির সমন্বয় করে এটি সমাধান হয়েছে। ভবিষ্যতের ওয়েব পরিষেবা কলগুলির জন্য আমরা ফল্ট স্টেট ত্রুটি বার্তা পেয়েছি তবুও ত্রুটিটি আমাদের শেষ ছিল।
সার্ভারটি স্বয়ংক্রিয়ভাবে সংযোগগুলি বাতিল করে দেবে যার উপরে প্রাপ্ত সময়সীমার সমান সময়ের জন্য কোনও বার্তা পাওয়া যায় নি ( ডিফল্ট 10 মিনিট হয়) )। সার্ভারকে অনির্দিষ্ট সময়ের জন্য সংযোগগুলি খুলতে বাধ্য করা থেকে বিরত রাখতে এটি একটি ডস প্রশমন is
যেহেতু সার্ভার সংযোগটি বাতিল করে কারণ এটি নিষ্ক্রিয় হয়ে গেছে, ক্লায়েন্টটি এই ব্যতিক্রম পায়।
সার্ভারের বাইন্ডিংয়ে প্রাপ্ত সময়সীমাটি কনফিগার করে সার্ভার কোনও সংযোগটি বাতিল করার আগে কতক্ষণ নিষ্ক্রিয় হওয়ার অনুমতি দেয় তা আপনি নিয়ন্ত্রণ করতে পারেন। ক্রেডিট: টিআর বিশ্বনাথ - এমএসএফটি
আমি জানি এটি একটি পুরানো পোস্ট তবে আপনি যখন সুরক্ষা পরিবর্তন করতে পারবেন না তখন আপনার ব্যবহারকারীর নাম এবং পাসওয়ার্ড সেট করা আছে কিনা তা নিশ্চিত হওয়া উচিত।
আমার ব্যবহারকারীর নাম ওভারট্রান্স ট্রান্সপোর্ট হিসাবে প্রমাণীকরণের কোড সহ একটি পরিষেবা ছিল, যখন পরিষেবা ক্লায়েন্টের জন্য ব্যবহারকারীর নাম এবং পাসওয়ার্ড সেট না করা হত আমি এই ত্রুটিটি পেয়ে যাব।
আমার জন্য এটি একটি লোড ব্যালেন্সার / ইউআরএল ইস্যু ছিল। লোড ব্যালান্সারের পিছনে থাকা একটি ওয়েব সার্ভিস সম্পূর্ণ ইউআরএল ব্যবহার করে: একই লোড ব্যালান্সারের পিছনে আরেকটি পরিষেবা বলে loadbalancer.mycompany.com
। localhost.mycompany.com
পরিবর্তে ব্যবহার করে দ্বিতীয় পরিষেবাটি কল করার সময় আমি এটিকে লোড ব্যালান্সারকে বাইপাস করেছিলাম ।
আমি মনে করি লোড ব্যালেন্সারের সাথে একরকম বিজ্ঞপ্তি সংক্রান্ত রেফারেন্স চলছে।
এই সমস্যার সমাধান নয়, তবে আপনি যদি এক্ট্রন ই-সিঙ্কের সাথে উপরের ত্রুটিটি অনুভব করছেন তবে এটি হতে পারে যে আপনার ডাটাবেসটি ডিস্কের জায়গার বাইরে চলে গেছে।
সম্পাদনা: বাস্তবে এটি পুরোপুরি একট্রন ই সিঙ্ক কেবল ইস্যু নয়। এটি এমন কোনও পরিষেবাতে ঘটতে পারে যা একটি সম্পূর্ণ ডাটাবেস অনুসন্ধান করে।
সম্পাদনা করুন: ডিস্কের জায়গার বাইরে, বা আপনার যে ডিরেক্টরিতে প্রয়োজন হবে সেই ডিরেক্টরিতে অ্যাক্সেস আটকে দেওয়ার ফলে এই সমস্যা দেখা দেবে।