HTTP পোষ্ট ত্রুটি ফেরায়: 417 "প্রত্যাশা ব্যর্থ হয়েছে।"


212

আমি যখন কোনও ইউআরএল পোস্ট করার চেষ্টা করি তখন এটি নিম্নলিখিত ব্যতিক্রমের ফলাফল:

রিমোট সার্ভারটি একটি ত্রুটি ফিরিয়ে দিয়েছে: (417) প্রত্যাশা ব্যর্থ।

এখানে একটি নমুনা কোড রয়েছে:

var client = new WebClient();

var postData = new NameValueCollection();
postData.Add("postParamName", "postParamValue");

byte[] responseBytes = client.UploadValues("http://...", postData);
string response = Encoding.UTF8.GetString(responseBytes); // (417) Expectation Failed.

একটি HttpWebRequest/HttpWebResponseজুড়ি বা একটি ব্যবহার করে কোনও HttpClientতফাত হয় না।

কি এই ব্যতিক্রম ঘটায়?


2
আপনার অ্যাপ্লিকেশন কোনও প্রক্সি সার্ভারের মাধ্যমে যোগাযোগ করার সময় সমস্যাটি মনে হচ্ছে। একটি নেট নেট অ্যাপ্লিকেশন আমি লিখেছিলাম যখন এটি সরাসরি ইন্টারনেটের সাথে সংযুক্ত ছিল কিন্তু যখন এটি প্রক্সি সার্ভারের পিছনে ছিল না।
সালমান এ

2
যখন কোনও ক্লায়েন্ট এইচটিটিপি 1.0 (কেবল) প্রক্সি সার্ভারের মাধ্যমে চলছে তখন এই শর্তটি পর্যবেক্ষণ করে। ক্লায়েন্ট (কোনও কনফিগারেশন ছাড়াই asmx প্রক্সি) একটি HTTP 1.1 অনুরোধ প্রেরণ করছে এবং প্রক্সিটি (কোনও সার্ভার জড়িত হওয়ার আগে) তারপরে প্রক্সিটি যা প্রেরণ করবে তা প্রত্যাখ্যান করে। যদি কোনও শেষ ব্যবহারকারীকে এই সমস্যাটি করে থাকে তবে নীচের কনফিগারেশন সমাধানটি ব্যবহার করা একটি যথাযথ কার্যকর কারণ Expectহ্যান্ডার যা প্রকৃতপক্ষে ডিফল্ট হিসাবে যুক্ত হয়ে থাকে Expect100Continueতা প্রক্সিটির উপর নির্ভরতা ছাড়াই অনুরোধগুলি উত্পন্ন করার কারণ হতে পারে true
রুবেন বারটেলিংক

উত্তর:


478

System.Net.HttpWebRequest শিরোনামটির 'এইচটিটিপি শিরোনাম "প্রত্যাশা করুন: 100-চালিয়ে যান" "প্রতিটি অনুরোধের সাথে যুক্ত করুন যদি আপনি এই স্থির সম্পত্তিটিকে মিথ্যা হিসাবে সেট করে না করে স্পষ্টভাবে জিজ্ঞাসা করেন :

System.Net.ServicePointManager.Expect100Continue = false;

কিছু সার্ভার সেই শিরোলেখীর উপরে চাপ সৃষ্টি করে এবং আপনি যে 417 ত্রুটি দেখছেন তা ফিরে পাঠায়।

একটি শট দিন।


5
আমার কিছু কোড ছিল যা টুইটারের সাথে কথা বলেছিল যা হঠাৎ ক্রিসমাসের পরদিন কাজ বন্ধ করে দেয়। তারা এমন একটি আপগ্রেড বা কনফিগার পরিবর্তন করেছিল যা তাদের সার্ভারগুলি সেই শিরোনামটিতে দম বন্ধ করতে বাধ্য করেছিল। এটা ঠিক করতে ব্যথা ছিল।
xcud

8
আমি মনে করি যে জোন স্কিটে একটি সমাধান পোস্ট করেছেন এমন কোনও থ্রেডে উত্তর গৃহীত হওয়ার জন্য আমি অতিরিক্ত 10 পয়েন্ট তুলেছি।
xcud

1
ধন্যবাদ! এই কোথাও যেমন MSDN উদাহরণ মধ্যে উল্লেখ করা উচিত msdn.microsoft.com/en-us/library/debx8sh9.aspx
ইউজিন

25
আপনি সেই অ্যাপ্লিকেশনটি আপনার অ্যাপ্লিকেশন কনফিগেও নির্দিষ্ট করতে পারেন: <system.net> <settings> <servicePointManager আশা 100Continue = "false" />। nahidulkibria.blogspot.com/2009/06/…
আন্দ্রে

2
দ্রষ্টব্য: এই সেটিংটি সার্ভিস রেফারেন্সগুলিতেও প্রযোজ্য এবং আমি ওয়েব-রেফারেন্সগুলি ধরে নিই।
মিস্টার

114

অন্য উপায় -

আপনার অ্যাপ্লিকেশন কনফিগার ফাইল কনফিগারেশন বিভাগে এই লাইনগুলি যুক্ত করুন:

<system.net>
    <settings>
        <servicePointManager expect100Continue="false" />
    </settings>
</system.net>

6
যখন আপনাকে একটি অপারেশনাল পরিবর্তন করতে হবে এবং কোড পরিবর্তনের জন্য প্রস্তুত নন তখন খুব ভাল কাজ করে।
দাবার

1
কনফিগার লাইনটি কি করে?
J86

31

এই একই পরিস্থিতি এবং ত্রুটিটি কোনও System.ServiceModelরান-টাইমে যখন একটি ডিফল্ট উইজার্ড উত্পন্ন এসওএপি ওয়েব পরিষেবা প্রক্সি (100% নয় যদি ডাব্লুসিএফ স্ট্যাকের ক্ষেত্রেও এটি হয় ) থেকে উদ্ভূত হতে পারে :

  • HTTP 1.1 বোঝে না এমন একটি প্রক্সি ব্যবহার করতে শেষ ব্যবহারকারী মেশিনটি কনফিগার করা হয়েছে (ইন্টারনেট সেটিংসে)
  • ক্লায়েন্ট এমন কিছু প্রেরণ শেষ করে যা HTTP 1.0 প্রক্সি বুঝতে পারে না (সাধারণত কোনও ExpectHTTP এর অংশ হিসাবে একটি শিরোনাম POSTবা PUTঅনুরোধটি এখানে দুটি অংশে প্রেরণ করার প্রমিত প্রোটোকল কনভেনশনের কারণে অনুরোধ হিসাবে এখানে মন্তব্যগুলিতে অন্তর্ভুক্ত থাকে )

... একটি ফলন 417।

অন্যান্য উত্তরের হিসাবে আচ্ছাদিত, আপনি যে নির্দিষ্ট সমস্যাটি চালাচ্ছেন তা যদি Expectশিরোনামটি সমস্যা সৃষ্টি করে, তবে সেই নির্দিষ্ট সমস্যাটিকে দ্বি-অংশের পুট / পোস্ট পোস্টের মাধ্যমে অপেক্ষাকৃত গ্লোবাল স্যুইচিং অফ করে চালানো যেতে পারে System.Net.ServicePointManager.Expect100Continue

তবে এটি সম্পূর্ণ অন্তর্নিহিত সমস্যাটি সমাধান করে না - স্ট্যাকটি এখনও HTTP 1.1 নির্দিষ্ট জিনিস যেমন কীপলাইভস ইত্যাদি ব্যবহার করতে পারে (যদিও অন্যান্য ক্ষেত্রে অন্যান্য উত্তরগুলি মূল ক্ষেত্রে অন্তর্ভুক্ত করে))

আসল সমস্যাটি হ'ল অটোজেনেটেড কোডটি ধরে নিয়েছে যে এইচটিটিপি 1.1 সুবিধাগুলি সবাই বুঝতে পারে সেভাবে অন্ধভাবে ব্যবহার করা ঠিক হবে। নির্দিষ্ট ওয়েব সার্ভিস প্রক্সিটির জন্য এই ধারণাটি বন্ধ করতে, কোনও এই ডাইরেক্টড প্রক্সি ক্লাস তৈরি HttpWebRequest.ProtocolVersionকরে ডিফল্টের ডিফল্ট থেকে 1.1 ডিফল্টকে ওভাররাইড পরিবর্তন করতে পারে যা এই পোস্টে প্রদর্শিত হিসাবে ওভাররাইড করে :protected override WebRequest GetWebRequest(Uri uri)

public class MyNotAssumingHttp11ProxiesAndServersProxy : MyWS
{
    protected override WebRequest GetWebRequest(Uri uri)
    {
      HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(uri);
      request.ProtocolVersion = HttpVersion.Version10;
      return request;
    }
}

( MyWSওয়েব রেফারেন্স যুক্ত উইজার্ডটি আপনাকে দেখানোর প্রক্সিটি কোথায় রয়েছে))


আপডেট: উত্পাদনে আমি ব্যবহার করছি এমন একটি ইমেল:

class ProxyFriendlyXXXWs : BasicHttpBinding_IXXX
{
    public ProxyFriendlyXXXWs( Uri destination )
    {
        Url = destination.ToString();
        this.IfProxiedUrlAddProxyOverriddenWithDefaultCredentials();
    }

    // Make it squirm through proxies that don't understand (or are misconfigured) to only understand HTTP 1.0 without yielding HTTP 417s
    protected override WebRequest GetWebRequest( Uri uri )
    {
        var request = (HttpWebRequest)base.GetWebRequest( uri );
        request.ProtocolVersion = HttpVersion.Version10;
        return request;
    }
}

static class SoapHttpClientProtocolRealWorldProxyTraversalExtensions
{
    // OOTB, .NET 1-4 do not submit credentials to proxies.
    // This avoids having to document how to 'just override a setting on your default proxy in your app.config' (or machine.config!)
    public static void IfProxiedUrlAddProxyOverriddenWithDefaultCredentials( this SoapHttpClientProtocol that )
    {
        Uri destination = new Uri( that.Url );
        Uri proxiedAddress = WebRequest.DefaultWebProxy.GetProxy( destination );
        if ( !destination.Equals( proxiedAddress ) )
            that.Proxy = new WebProxy( proxiedAddress ) { UseDefaultCredentials = true };
    }
}

2
আমি জানি আপনি এটি পোস্ট করেছেন বেশ কিছুক্ষণ আগে, তবে রুবেন আপনি জীবন রক্ষাকারী। আমি আপনার সমাধানটি না আসা পর্যন্ত এই বিষয়টি আমাকে উন্মাদ করে চলেছে এবং এটি পুরোপুরি কার্যকর হয়। চিয়ার্স!
ক্রিস্টোফার ম্যাকআটাকনি

1
@ ক্রিসম্যাকএটাকনি আপনার স্বাগত। এটি অবশ্যই তাদের সময়ে এটি দলিল করার প্রচেষ্টার পক্ষে যথাযথ বলে মনে হয়েছিল ... সাধারণ সমস্যাটি শীর্ষস্থানীয় সমস্যা হিসাবে পরিণত হওয়ার প্রান্তকে ঘিরে ধরে এবং ঠিকমতো তদন্ত না করা পর্যন্ত আমাকে বিরক্ত করে - তবুও কোনও গুগলের রস বলে মনে হয় নি ইস্যু যে দিক। এবং এটি ফিরে যাওয়ার পথ থেকে এটি অ্যাটউড চপের পোস্টগুলির মধ্যে একটি ছিল যা আমাকে এটি করতে বাধ্য করেছিল। (এই মত একটি মন্তব্য সঙ্গে একটি
upvote

1
বিস্ময়কর সংযোজন এবং উদাহরণ। ধন্যবাদ!
ফাদি চামিহ

5

আপনি যে ফর্মটি অনুকরণ করার চেষ্টা করছেন সেটির কি দুটি ক্ষেত্র, ব্যবহারকারীর নাম এবং পাসওয়ার্ড রয়েছে?

যদি তাই হয় তবে এই লাইন:

 postData.Add("username", "password");

সঠিক নয়.

আপনার দুটি লাইনের প্রয়োজন হবে:

 postData.Add("username", "Moose");
postData.Add("password", "NotMoosespasswordreally");

সম্পাদনা:

ঠিক আছে, যেহেতু সমস্যাটি নয়, এটি মোকাবেলা করার একটি উপায় হ'ল ফিডলার বা উইয়ারশার্কের মতো ওয়েব ব্রাউজার থেকে ওয়েব সার্ভারে কী পাঠানো হচ্ছে তা দেখার জন্য, তারপরে আপনার কোড থেকে যা পাঠানো হচ্ছে তার সাথে তুলনা করুন। আপনি নেট। 80 থেকে একটি সাধারণ বন্দর 80 এ যাচ্ছেন তবে ফিডলার এখনও এই ট্র্যাফিকটি ক্যাপচার করবে।

ফর্মটিতে সম্ভবত অন্য কোনও লুকানো ক্ষেত্র রয়েছে যা ওয়েব সার্ভার আশা করছে যে আপনি প্রেরণ করছেন না।


3

প্রক্সি দিক থেকে সমাধান, আমি এসএসএল হ্যান্ডশেক প্রক্রিয়ায় কিছু সমস্যার মুখোমুখি হয়েছি এবং আমার প্রক্সি সার্ভারকে HTTP / 1.0 ব্যবহার করে অনুরোধগুলি প্রেরণ করতে বাধ্য করতে হয়েছিল এই যুক্তিটি httpd.conf এ সেট করার SetEnv force-proxy-request-1.0 1 SetEnv proxy-nokeepalive 1পরে যে হিসাবে আমি 417 ত্রুটির সম্মুখীন হয়েছিলাম আমার ক্লায়েন্টদের অ্যাপ্লিকেশনটি HTTP / 1.1 ব্যবহার করছিল এবং প্রক্সিটি HTTP / 1.0 ব্যবহার করতে বাধ্য RequestHeader unset Expect earlyহয়েছিল, ক্লায়েন্ট পক্ষের কোনও পরিবর্তন করার প্রয়োজন ছাড়াই প্রক্সি পক্ষের এই পরামিতিটি httpd.conf এ সেট করে সমস্যার সমাধান করা হয়েছিল , আশা করি এটি সাহায্য করে ।



1

আপনি যদি " এইচটিপিপিলেট " ব্যবহার করে থাকেন এবং আপনি যে সমস্ত প্রোগ্রাম ব্যবহার করতে পারেন তার উপর প্রভাব ফেলতে আপনি বিশ্বব্যাপী কনফিগারেশন ব্যবহার করতে চান না:

 HttpClientHandler httpClientHandler = new HttpClientHandler();
 httpClient.DefaultRequestHeaders.ExpectContinue = false;

আমি আপনি " ওয়েবক্লিয়েন্ট " ব্যবহার করছেন বলে আমার মনে হয় আপনি কল করে এই শিরোলেখ অপসারণ করতে চেষ্টা করতে পারেন:

 var client = new WebClient();
 client.Headers.Remove(HttpRequestHeader.Expect);

0

আমার পরিস্থিতিতে, এই ত্রুটিটি কেবল তখনই ঘটবে বলে মনে হয় যদি আমার ক্লায়েন্টের কম্পিউটারে একটি কঠোর ফায়ারওয়াল নীতি থাকে, যা আমার প্রোগ্রামটিকে ওয়েব পরিষেবার সাথে যোগাযোগ করতে বাধা দেয়।

সুতরাং কেবলমাত্র আমি যে সমাধানটি খুঁজে পেতে পারি তা হ'ল ত্রুটিটি ধরা এবং ফায়ারওয়াল সেটিংস ম্যানুয়ালি পরিবর্তনের বিষয়ে ব্যবহারকারীকে অবহিত করা।


-1

ওয়েবকনফিগ পদ্ধতির ইনফপ্যাথ ফর্ম পরিষেবাগুলির জন্য কাজ করে ইনটপ অ্যাপ্লিকেশন পরিষেবাটি সক্ষম বিধিগুলিতে।

  <system.net>
    <defaultProxy />
    <settings> <!-- 20130323 bchauvin -->
        <servicePointManager expect100Continue="false" />
    </settings>
  </system.net>

2
এর DUP stackoverflow.com/a/7358457/11635 দয়া করে সেখানে মন্তব্য আপনি একটি বিন্দু যোগ করতে চান তবে
রুবেন Bartelink
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.