2013-07-02 3 views
1

Problème: Lors de la publication sur le service de repos WCF sur le client https, 400 demandes incorrectes sont envoyées.Échec de l'envoi au service de repos WCF via la demande incorrecte HTTPS 400

Tout cela fonctionne dans un environnement de test sans problèmes. Le Web de test fonctionne sur https, mais la méthode post échoue avec une requête 400 incorrecte. La seule différence entre test et prod est la configuration web où je devais ajouter les comportements et les liaisons pour que la méthode webget de test fonctionne. Mais je n'arrive pas à comprendre ce qui cause l'échec d'un message.

J'ai également essayé d'ajouter initialement des points de terminaison et des services spécifiques et j'ai trouvé une meilleure solution pour utiliser les points de terminaison standard. Donc j'ai enlevé les endpoints et les services parce que tout devrait être enregistré par le fichier global.asax correct.

Toute aide, suggestions, ou voir l'évidence que je suis sûr que j'ai regardé plus de 100 fois maintenant.

Code de service:

[ServiceContract] 
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 
public class Uploader 
{ 
    [WebGet(UriTemplate = "Test")] 
    public String Test() 
    { 
     return "connected"; 
    } 

    [OperationContract] 
    [WebInvoke(UriTemplate = "UploadClaim/{fileName}/{device_id}/{fSize}", Method = "POST")] 
    public String UploadClaim(string fileName, string device_id, string fSize, Stream zipFile) 
    { 
     // Handle post request and store file 
    } 

} 

Global.asax:

void Application_Start(object sender, EventArgs e) 
{ 
    RouteTable.Routes.Add(new ServiceRoute("uploads", new WebServiceHostFactory(), typeof(Uploader))); 

} 

Web.config:

<system.serviceModel> 
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> 

<behaviors> 
    <serviceBehaviors> 
    <behavior name=""> 
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> 
     <serviceAuthorization principalPermissionMode="None"/> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<bindings> 
    <webHttpBinding> 
    <binding> 
     <security mode="Transport"> 
      <transport clientCredentialType="None" proxyCredentialType="None" /> 
     </security> 
    </binding> 
    <binding name="UnsecureBinding"></binding> 
    </webHttpBinding> 
</bindings> 
<protocolMapping> 
    <add scheme="http" binding="webHttpBinding" bindingConfiguration="UnsecureBinding" /> 
    <add scheme="https" binding="webHttpBinding" bindingConfiguration="UnsecureBinding" /> 
</protocolMapping> 
<standardEndpoints> 
    <webHttpEndpoint> 
    <!-- 
     Configure the WCF REST service base address via the global.asax.cs file and the default endpoint 
     via the attributes on the <standardEndpoint> element below 
    --> 
    <standardEndpoint name="" helpEnabled="true" defaultOutgoingResponseFormat="Json" maxReceivedMessageSize="67108864" 
    transferMode="Buffered"> 
    <security mode="Transport"> 
      <transport clientCredentialType="None" proxyCredentialType="None" /> 
     </security> 
    </standardEndpoint> 

    </webHttpEndpoint> 
</standardEndpoints> 


</system.serviceModel> 

Demande client:

// This url is not the actual but not the problem. 
    // The only difference from test to prod is http vs https 
requestUrl = "https://MyDomain.com/uploads/UploadClaim/{FILENAME}/{DEVICE_ID}/{FSIZE}"; 



      HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(requestUrl); 

      request.Method = "POST"; 

      request.ContentType = "application/octet-stream"; 

      request.Timeout = 1000000; 

      request.KeepAlive = true; 

      request.AllowWriteStreamBuffering = true; 

      //request.SendChunked = true; 

      //request.ContentType = "application/octet-stream"; 

      //FileStream inputStream = File.OpenRead(strfPath); 

      //request.ContentLength = inputStream.Length; 



      byte[] fileToSend = File.ReadAllBytes(strfPath); 

      request.ContentLength = fileToSend.Length; 



      //Byte[] buffer = new Byte[inputStream.Length]; 

      ///Stream requestStream = request.GetRequestStream(); 

      using(Stream requestStream = request.GetRequestStream()){ 

       bool canWrite = requestStream.CanWrite; 

       // Send the file as body request. 

       requestStream.Write(fileToSend, 0, fileToSend.Length); 



       requestStream.Flush(); 

       requestStream.Close(); 

      } 

Répondre

1

Wow, Alors capitaine évident s'est finalement manifesté.

Merci à la réponse d'Aaron Hoffman dans ce poste: Large WCF web service request failing with (400) HTTP Bad Request

Ajout des diagnostics ci-dessous me permettent d'identifier que le compte IIS_USER ne dispose pas des autorisations d'écriture sur le répertoire que je tentais d'écrire aussi. Même si le répertoire est dans le répertoire du site. Ajout d'autorisations à IIS_USER pour écrire dans le dossier et plus de problèmes.

Espérons que cela peut aider quelqu'un d'autre donnant sur l'évidence comme moi :)

<system.diagnostics> 
<sources> 
    <source name="System.ServiceModel" 
       switchValue="Information, ActivityTracing" 
       propagateActivity="true"> 
     <listeners> 
      <add name="traceListener" 
       type="System.Diagnostics.XmlWriterTraceListener" 
       initializeData= "c:\log\Traces.svclog" /> 
     </listeners> 
    </source> 
</sources> 

Questions connexes