locked
HTTP Status 417: Expectation Failed RRS feed

  • Question

  • Hi,

    My vb2008 application is deployed at quite a few sites. It calls a few external webservices. From one client, the error message returned by the call to the webservice is The request failed with HTTP Status 417: Expectation failed.

    It calls webservices on 2 servers  - both external - it works with calls to one server but not the other (they are different functions). We don't have this problem from any other client...


    Any idea ?

    thanks
    Bruce
    Wednesday, July 30, 2008 2:15 AM

Answers

  • HTTP protocol states that any message starting in the 4XX range is a SERVER error message.  This means the server is choking on the request.  Now all you have to do is find out why?  For example we all know that 404 is page not found.  That really is based most of the time in a client URL being wrong, however, the SERVER could have moved the page too...

    The 417 is documented at W3 as follows:

    10.4.18 417 Expectation Failed

    The expectation given in an Expect request-header field (see section 14.20) could not be met by this server, or, if the server is a proxy, the server has unambiguous evidence that the request could not be met by the next-hop server.

    Section 14.20 reads:

    14.20 Expect

    The Expect request-header field is used to indicate that particular server behaviors are required by the client.

     Expect = "Expect" ":" 1#expectation 
     expectation = "100-continue" | expectation-extension expectation-extension = token [ "=" ( token | quoted-string ) *expect-params ] expect-params = ";" token [ "=" ( token | quoted-string ) ] 

    A server that does not understand or is unable to comply with any of the expectation values in the Expect field of a request MUST respond with appropriate error status. The server MUST respond with a 417 (Expectation Failed) status if any of the expectations cannot be met or, if there are other problems with the request, some other 4xx status.

    This header field is defined with extensible syntax to allow for future extensions. If a server receives a request containing an Expect field that includes an expectation-extension that it does not support, it MUST respond with a 417 (Expectation Failed) status.

    Comparison of expectation values is case-insensitive for unquoted tokens (including the 100-continue token), and is case-sensitive for quoted-string expectation-extensions.

    The Expect mechanism is hop-by-hop: that is, an HTTP/1.1 proxy MUST return a 417 (Expectation Failed) status if it receives a request with an expectation that it cannot meet. However, the Expect request-header itself is end-to-end; it MUST be forwarded if the request is forwarded.

    Many older HTTP/1.0 and HTTP/1.1 applications do not understand the Expect header.

    See section 8.2.3 for the use of the 100 (continue) status.



    So what does this mean to you?  Well..... what I'd do is download Wireshark and see what packet was sent that generates this, you can actually see the Header request that was made...  From there you can back track in your code to see what caused it.  Bottom line is that it looks like your client request was rejected by the Server as a "I can't do that"...


    Javaman
    Friday, August 1, 2008 2:50 PM

All replies

  • Hi Bruce,
    what is your application using? Is is HttpWebRequest? We are not setting the expectation header by default, unless you specifically add it yourself. If that is not the case please post a small snippet (if possible) of what your app is doing, get a System.Net trace log (or netmon capture) to see what goes on the wire to trigger the server to send this header. If you need instructions how to do this please go here:
    http://blogs.msdn.com/ncl/archive/2008/07/25/how-to-troubleshoot-your-system-net-code.aspx



    Thanks
    Mariya
    Thursday, July 31, 2008 3:42 PM
    Moderator
  • I had a problem like this before.  I think it had something to do with asp.net writing a header called except continue.  There is a static property to stop it. 

    System.Net.ServicePointManager.Expect100Continue = false;
    Friday, August 1, 2008 4:44 AM
  • HTTP protocol states that any message starting in the 4XX range is a SERVER error message.  This means the server is choking on the request.  Now all you have to do is find out why?  For example we all know that 404 is page not found.  That really is based most of the time in a client URL being wrong, however, the SERVER could have moved the page too...

    The 417 is documented at W3 as follows:

    10.4.18 417 Expectation Failed

    The expectation given in an Expect request-header field (see section 14.20) could not be met by this server, or, if the server is a proxy, the server has unambiguous evidence that the request could not be met by the next-hop server.

    Section 14.20 reads:

    14.20 Expect

    The Expect request-header field is used to indicate that particular server behaviors are required by the client.

     Expect = "Expect" ":" 1#expectation 
     expectation = "100-continue" | expectation-extension expectation-extension = token [ "=" ( token | quoted-string ) *expect-params ] expect-params = ";" token [ "=" ( token | quoted-string ) ] 

    A server that does not understand or is unable to comply with any of the expectation values in the Expect field of a request MUST respond with appropriate error status. The server MUST respond with a 417 (Expectation Failed) status if any of the expectations cannot be met or, if there are other problems with the request, some other 4xx status.

    This header field is defined with extensible syntax to allow for future extensions. If a server receives a request containing an Expect field that includes an expectation-extension that it does not support, it MUST respond with a 417 (Expectation Failed) status.

    Comparison of expectation values is case-insensitive for unquoted tokens (including the 100-continue token), and is case-sensitive for quoted-string expectation-extensions.

    The Expect mechanism is hop-by-hop: that is, an HTTP/1.1 proxy MUST return a 417 (Expectation Failed) status if it receives a request with an expectation that it cannot meet. However, the Expect request-header itself is end-to-end; it MUST be forwarded if the request is forwarded.

    Many older HTTP/1.0 and HTTP/1.1 applications do not understand the Expect header.

    See section 8.2.3 for the use of the 100 (continue) status.



    So what does this mean to you?  Well..... what I'd do is download Wireshark and see what packet was sent that generates this, you can actually see the Header request that was made...  From there you can back track in your code to see what caused it.  Bottom line is that it looks like your client request was rejected by the Server as a "I can't do that"...


    Javaman
    Friday, August 1, 2008 2:50 PM
  • Did the post above answer your question? If so, please mark it as answered.

    Thanks
    Mariya
    Wednesday, August 6, 2008 2:58 PM
    Moderator