문제

하려고 할 때에 게시하는 URL 에서 그 결과는 다음과 같은 예외:

원격 서버에서 오류를 반환했습니다:(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 지 않습니다.

원인이 무엇이 예외?

도움이 되었습니까?

해결책

시스템입니다.Net.된 플러그 가능한 추가하는 헤더'HTTP 헤더를"기대:100 계속"'모든 요청하지 않는 한 명시하지 않는 그것에 의해 설정 이 정적 재산 false:

System.Net.ServicePointManager.Expect100Continue = false;

어떤 서버에 질식하는 헤더 다시 보내 417 오류가 있습니다.

제공하는습니다.

다른 팁

또 다른 방법 -

응용 프로그램 구성 파일 구성 섹션 에이 줄을 추가하십시오.

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

이 같은 상황에 오류가 발생할 수 있습니다 기본 생성 마법사의 비누 웹사 서비스는 프록시(100%는 경우 이러한 경우에 WCF System.ServiceModel stack)이 때 런타임:

  • 최종 사용자 기기 구성(인터넷에서 설정)을 프록시를 사용하지 않는 이해하는 HTTP1.1
  • 클라이언트는 끝나 뭔가를 보내는 HTTP1.0 프록시전을 이해(일반적으로 Expect 헤더의 일부로 HTTP POSTPUT 요청으로 인해 표준 프로토콜회의 요청을 보내에서 두 개의 부품 로에서 다루는 주기)

...를 산출 417.

으로 덮여 다른 답변을 경우,특정한 문제로 실행하는 Expect 헤더의 문제를 일으키는지,그 다음은 특정한 문제가 될 수 있 주위에 라우팅을 수행하여 상대적으로 글로벌 전환의 두 가지 부분으로 넣어/POST 송 System.Net.ServicePointManager.Expect100Continue.

그러나 해결되지 않은 완벽한 근본적인 문제-스택할 수 있는 여전히 사용하는 HTTP1.1 특정한 것과 같은 킵 얼라이브 등등.(하지만 많은 경우에 다른 답변을 덮는 주요한 경우입니다.)

실제 문제입니다 그러나 그는 자동으로 생성된 코드에서는 확인을 맹목적으로 이동을 사용하여 HTTP1.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 는 프록시는 웹 참조 추가 마법사의 말다툼에 있습니다.)


업데이트:여기에는 impl 사용하고 생산에서는:

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 };
    }
}

에뮬레이션하려는 양식에는 사용자 이름과 비밀번호의 두 필드가 있습니까?

그렇다면이 줄 :

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

정확하지 않습니다.

다음과 같은 두 줄이 필요합니다.

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

편집하다:

좋아, 이것이 문제가되지 않기 때문에, 이것을 다루는 한 가지 방법은 Fiddler 또는 Wireshark와 같은 것을 사용하여 브라우저에서 웹 서버로 전송되는 것을 시청 한 다음 코드에서 전송되는 내용과 비교하는 것입니다. .NET에서 일반 포트 80으로 이동하는 경우 Fiddler는 여전히이 트래픽을 캡처합니다.

웹 서버가 보내지 않을 것으로 예상되는 형태의 다른 숨겨진 필드가있을 것입니다.

프록시 측에서 솔루션 SSL 핸드 셰이크 프로세스에서 몇 가지 문제에 직면했으며 프록시 서버가 httpd.conf 에서이 인수를 설정하여 문제를 해결하기 위해 http/1.0을 사용하여 요청을 보내도록 강요해야했습니다. SetEnv force-proxy-request-1.0 1 SetEnv proxy-nokeepalive 1 그 후 클라이언트 응용 프로그램이 HTTP/1.1을 사용하고 프록시는 HTTP/1.0을 사용해야함에 따라 417 오류에 직면했으며,이 매개 변수를 프록시 측에서 httpd.conf로 설정하여 문제가 해결되었습니다. RequestHeader unset Expect early 클라이언트 측의 어떤 것도 변경할 필요가 없으면 이것이 도움이되기를 바랍니다.

PowerShell의 경우입니다

[System.Net.ServicePointManager]::Expect100Continue = $false

사용중인 경우 "httpclient"그리고 당신은 글로벌 구성을 사용하여 사용할 수있는 모든 프로그램에 영향을 미치고 싶지 않습니다.

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

나는 당신이 사용하고 있습니다 "웹 클라이언트"나는 당신이 다음을 호출 하여이 헤더를 제거하려고 시도 할 수 있다고 생각합니다.

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

내 상황 에서이 오류는 내 클라이언트의 컴퓨터에 엄격한 방화벽 정책이있는 경우에만 발생하는 것 같습니다. 이는 내 프로그램이 웹 서비스와 통신하는 것을 방지합니다.

따라서 내가 찾을 수있는 솔루션 만 오류를 포착하고 방화벽 설정을 수동으로 변경하는 것에 대해 사용자에게 알리는 것입니다.

Web.config Approach는 InfoPath Form Services 호출에 대해 Intapp Web Service 지원 규칙에 대해 작동합니다.

  <system.net>
    <defaultProxy />
    <settings> <!-- 20130323 bchauvin -->
        <servicePointManager expect100Continue="false" />
    </settings>
  </system.net>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top