দেখে মনে হচ্ছে ওয়েব রেফারেন্সে কল ব্যতিক্রম ছড়িয়ে দিলে টিম কার্টারের সমাধানটি কাজ করে না। আমি কাঁচা ওয়েব রেজোনেসে পৌঁছানোর চেষ্টা করছি যাতে ব্যতিক্রম ছোঁড়ার পরে আমি ত্রুটি হ্যান্ডলারে এটি (কোডে) পরীক্ষা করতে পারি। তবে, আমি দেখতে পাচ্ছি যে টিমের পদ্ধতি দ্বারা লিখিত প্রতিক্রিয়া লগ ফাঁকা রয়েছে যখন কলটি ব্যতিক্রম ছুঁড়ে দেয়। আমি কোডটি পুরোপুরি বুঝতে পারি না, তবে এটি প্রদর্শিত হয় যে টিমের পদ্ধতিটি সেই বিন্দুটির পরে প্রক্রিয়াতে কাটবে যেখানে নেট ইতিমধ্যে ওয়েব প্রতিক্রিয়াটিকে অবৈধ এবং বাতিল করে দিয়েছে।
আমি এমন ক্লায়েন্টের সাথে কাজ করছি যা নিম্ন স্তরের কোডিং সহ ম্যানুয়ালি একটি ওয়েব পরিষেবা বিকাশ করছে। এই মুহুর্তে, তারা তাদের অভ্যন্তরীণ প্রক্রিয়া ত্রুটি বার্তাগুলি এইচটিএমএল ফর্ম্যাট বার্তাগুলি হিসাবে প্রতিক্রিয়ার মধ্যে যোগ করছে SOAP ফর্ম্যাট প্রতিক্রিয়া আগে। অবশ্যই, অটোম্যাজিক। নেট ওয়েব রেফারেন্স এটির উপরে ফুরিয়েছে। যদি কোনও ব্যতিক্রম ছুঁড়ে ফেলার পরে আমি যদি কাঁচা এইচটিটিপি প্রতিক্রিয়া পেতে পারি তবে আমি মিশ্রিত ফিরে আসা এইচটিটিপি প্রতিক্রিয়াটির মধ্যে কোনও এসওএপি প্রতিক্রিয়া সন্ধান করতে এবং পার্স করতে পারি এবং তারা জানতে পারে যে তারা আমার ডেটা পেয়েছে ঠিক আছে কি না।
পরে ...
এখানে একটি সমাধান যা কাজ করে, এমনকি মৃত্যুদণ্ড কার্যকর হওয়ার পরেও (দ্রষ্টব্য যে আমি কেবল প্রতিক্রিয়ার পরে আছি - অনুরোধটি পেতে পারে):
namespace ChuckBevitt
{
class GetRawResponseSoapExtension : SoapExtension
{
public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute)
{
return null;
}
public override object GetInitializer(Type serviceType)
{
return null;
}
public override void Initialize(object initializer)
{
}
private bool IsResponse = false;
public override void ProcessMessage(SoapMessage message)
{
if (message.Stage == SoapMessageStage.AfterSerialize)
IsResponse = true;
else
IsResponse = false;
}
public override Stream ChainStream(Stream stream)
{
if (IsResponse)
{
StreamReader sr = new StreamReader(stream);
string response = sr.ReadToEnd();
sr.Close();
sr.Dispose();
File.WriteAllText(@"C:\test.txt", response);
byte[] ResponseBytes = Encoding.ASCII.GetBytes(response);
MemoryStream ms = new MemoryStream(ResponseBytes);
return ms;
}
else
return stream;
}
}
}
আপনি এটি কনফিগার ফাইলে কনফিগার করবেন তা এখানে:
<configuration>
...
<system.web>
<webServices>
<soapExtensionTypes>
<add type="ChuckBevitt.GetRawResponseSoapExtension, TestCallWebService"
priority="1" group="0" />
</soapExtensionTypes>
</webServices>
</system.web>
</configuration>
"TestCallWebService" জোরে লাইব্রেরির নামের সাথে প্রতিস্থাপন করা হবে (এটি যে পরীক্ষামূলক কনসোল অ্যাপটিতে আমি কাজ করছিলাম তার নাম হতে পারে)।
আপনার সত্যিই চেইনস্ট্রিম যেতে হবে না; আপনার প্রসেসমেসেজ থেকে আরও সহজভাবে এটি করতে সক্ষম হওয়া উচিত:
public override void ProcessMessage(SoapMessage message)
{
if (message.Stage == SoapMessageStage.BeforeDeserialize)
{
StreamReader sr = new StreamReader(message.Stream);
File.WriteAllText(@"C:\test.txt", sr.ReadToEnd());
message.Stream.Position = 0;
}
}
আপনি যদি সোপম্যাসেজ.স্ট্রিমটি সন্ধান করেন তবে এটি কেবল পঠনযোগ্য স্ট্রিম হিসাবে মনে করা হবে যা আপনি এই সময়ে ডেটা পরিদর্শন করতে ব্যবহার করতে পারেন। আপনি যদি স্ট্রিমটি পড়েন, পরবর্তী কোনও প্রক্রিয়াকরণ বোমা কোনও ডেটা ত্রুটি না পাওয়া (স্ট্রিমটি শেষ ছিল) এবং আপনি অবস্থানটি শুরুতে পুনরায় সেট করতে পারবেন না তবে এটি একটি স্ক্রু-আপ কারণ।
মজার বিষয় হল, আপনি যদি দুটি পদ্ধতি, চেনস্ট্রিম এবং প্রসেসমেজ উপায়গুলি করেন তবে প্রসেসমেজ পদ্ধতিটি কাজ করবে কারণ আপনি কানট্রিম স্ট্রিম থেকে চেনস্ট্রিমের মেমরিস্ট্রিমে স্ট্রিমের ধরন পরিবর্তন করেছেন এবং মেমরিস্ট্রিম অপারেশনগুলি সন্ধান করতে দেয় না। (আমি কানেক্টস্ট্রিমকে মেমোরিস্ট্রিমে কাস্ট করার চেষ্টা করেছি - অনুমতি দেওয়া হয়নি।)
সুতরাং ..... মাইক্রোসফ্টকে হয় চেইনস্ট্রিম প্রকারে অপারেশনগুলি সন্ধান করতে হবে বা সোপম্যাসেজ করা উচিত St স্ট্রিমটি সত্যই একটি পঠনযোগ্য অনুলিপি হিসাবে অনুমিত হওয়া উচিত। (আপনার কংগ্রেসম্যান ইত্যাদি লিখুন ...)
আরও একটি বিষয়। কোনও ব্যতিক্রমের পরে কাঁচা এইচটিটিপি প্রতিক্রিয়া পুনরুদ্ধার করার একটি উপায় তৈরি করার পরেও আমি এখনও পূর্ণ প্রতিক্রিয়া পাইনি (কোনও HTTP স্নিফার দ্বারা নির্ধারিত হিসাবে)। এটি কারণ কারণ যখন ডেভলপমেন্ট ওয়েব পরিষেবা প্রতিক্রিয়ার শুরুতে এইচটিএমএল ত্রুটি বার্তাগুলি যুক্ত করেছিল, তখন এটি সামগ্রী-দৈর্ঘ্যের শিরোনামকে সামঞ্জস্য করে না, সুতরাং সামগ্রী-দৈর্ঘ্যের মানটি প্রকৃত প্রতিক্রিয়া বডির আকারের চেয়ে কম ছিল। আমি যা পেয়েছি তা হ'ল অক্ষরের সামগ্রীর দৈর্ঘ্যের মান সংখ্যা - বাকিগুলি অনুপস্থিত ছিল। স্পষ্টতই, যখন নেট প্রতিক্রিয়া প্রবাহটি পড়ে, এটি কেবলমাত্র কন্টেন্ট-দৈর্ঘ্যের অক্ষরের সংখ্যা পড়ে এবং সামগ্রী-দৈর্ঘ্যের মানটি সম্ভবত ভুল হওয়ার অনুমতি দেয় না। হিসাবে এটি হওয়া উচিত হয়; তবে যদি বিষয়বস্তু-দৈর্ঘ্যের শিরোলেখের মানটি ভুল হয় তবে আপনি এইচটিটিপি স্নিফার সহ পুরো প্রতিক্রিয়া বডিটি পাবেন এমন একমাত্র উপায় (আমি ব্যবহারকারী HTTP বিশ্লেষক থেকেhttp://www.ieinspector.com )।