Esta misma situación y error también pueden surgir con un asistente por defecto genera SOAP de proxy de servicio web (no 100% si este es también el caso en la pila WCF System.ServiceModel
) cuando en tiempo de ejecución:
- el usuario final máquina está configurada (en la Configuración de Internet) para usar un proxy que no comprende HTTP 1.1
- el cliente termina enviando algo que un proxy HTTP 1.0 no comprende (comúnmente un encabezado
Expect
como parte de una solicitud HTTP POST
o PUT
debido a una convención de protocolo estándar de enviar la solicitud en dos partes as covered in the Remarks here)
... obteniendo un 417.
Como se explica en las otras respuestas, si el problema específico que se encuentra es que el encabezado Expect
está causando el problema, entonces ese problema específico se puede enrutar haciendo una desconexión relativamente global de las dos partes PUT/Transmisión POST a través de System.Net.ServicePointManager.Expect100Continue
.
Sin embargo, esto no se resuelve el problema de fondo completa - la pila pueda estar utilizando HTTP 1.1 cosas específicas, tales como KeepAlive etc. (aunque en muchos casos las otras respuestas cubren los casos principales.)
Sin embargo, el problema real es que el código autogenerado asume que está bien pasar ciegamente a través de las instalaciones de HTTP 1.1 ya que todos entienden esto. Para detener esta suposición de un proxy de servicio web específica, se puede cambiar reemplazar el valor predeterminado subyacente HttpWebRequest.ProtocolVersion
del valor predeterminado de 1.1 mediante la creación de una clase de proxy derivada que anula protected override WebRequest GetWebRequest(Uri uri)
as shown in this post: -
public class MyNotAssumingHttp11ProxiesAndServersProxy : MyWS
{
protected override WebRequest GetWebRequest(Uri uri)
{
HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(uri);
request.ProtocolVersion = HttpVersion.Version10;
return request;
}
}
(donde MyWS
es el proxy de la asistente para agregar referencia web escupió a la vista)
ACTUALIZACIÓN:. he aquí un impl estoy usando en la producción:
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 };
}
}
El problema parece ocurrir cuando su aplicación se comunica a través de un servidor proxy. Una aplicación .NET que escribí funcionó cuando estaba conectada directamente a Internet, pero no cuando estaba detrás de un servidor proxy. –
Se observó esta condición cuando un cliente se está ejecutando a través de un servidor proxy HTTP 1.0 (solamente).El cliente (proxy asmx sin ninguna configuración) está enviando una solicitud HTTP 1.1 y el proxy (antes de que cualquier servidor pueda participar) y luego rechaza lo que envía el proxy. Si un usuario final tiene este problema, usar la [solución de configuración a continuación] (http://stackoverflow.com/a/7358457/11635) es una solución apropiada ya que provocaría que se generaran solicitudes sin confiar en la comprensión del proxy. el encabezado 'Expect' que de forma predeterminada se agrega como' Expect100Continue' es 'true' de manera predeterminada. –