Essayer de faire appel à un service WCF avec un WebRequest

J'ai un service WCF qui doit être appelé par une 3ème partie application, la publication de certains XML brut.

Je suis en train de tester mon service par la construction d'une simple WebRequest et de faire la demande pour le service.

Voici mon code de service:

Interface:

    [ServiceContract(Namespace = "http://test.mydomain.com")]
public interface ITest
{
    [WebInvoke(UriTemplate = "", BodyStyle = WebMessageBodyStyle.Bare, Method="POST")]
    [OperationContract]
    Stream SaveXML(Stream input);
}

Service:

    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(Namespace = "http://test.mydomain.com")]
public class Test : ITest
{
    public Stream SaveXML(Stream input)
    {
        StreamReader streamReader = new StreamReader(input);
        string rawString = streamReader.ReadToEnd();
        streamReader.Dispose();

        //here need to save the input stream to xml format file
        Encoding encoding = Encoding.GetEncoding("ISO-8859-1");
        WebOperationContext.Current.OutgoingResponse.ContentType = "text/xml";
        byte[] returnBytes = encoding.GetBytes(rawString);
        return new MemoryStream(returnBytes);
    }
}

config:

    <services>
  <service behaviorConfiguration="Blah.TestBehavior" name="Blah.Test">
    <endpoint address="http://localhost:51494/Blah/Test.svc" binding="basicHttpBinding" contract="Blah.ITest">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  </service>
</services>

défectueux code client:

            string postData = "<Message version=\"1.5\" xmlns=\"http://test.mydomain.com\" ><books>Blah</books></Message>";
        WebRequest request = WebRequest.Create("http://localhost:51494/Blah/Test.svc/SaveXML");
        request.Method = "POST";

        byte[] byteArray = Encoding.UTF8.GetBytes(postData);
        request.ContentType = "application/x-www-form-urlencoded";
        //request.ContentType = "text/xml; charset=utf-8";
        //request.ContentType = "text/xml;";
        //request.ContentType = "application/xml;";
        request.ContentLength = byteArray.Length;

        Stream dataStream = request.GetRequestStream();
        dataStream.Write(byteArray, 0, byteArray.Length);
        dataStream.Close();

        //Get the response.
        WebResponse response = request.GetResponse();

Sur cette dernière ligne, je reçois un 400 (Bad Request) ou 415 (Unsupported Media Type d'erreur, en fonction de la ContentType je précise.

Aussi, si je peux ajouter une référence de service dans mon application client, et appeler le service à l'aide de l'API, il fonctionne très bien. Toutes les suggestions seraient grandement appréciés, comme je suis nouveau sur WCF et complètement perplexe.

  • Ce que je voudrais faire: utiliser Fiddler fiddler2.com/fiddler2 pour voir la demande de "l'API" - l'un qui fonctionne. Puis de le comparer à la requête qui ne fonctionne pas. Qui devrait le réduire.
  • Votre StreamReader doit être dans un using bloc, comme le font plusieurs de vos autres objets. Un using bloc va les amener à être éliminés, même si une exception est levée.
InformationsquelleAutor Seth | 2010-03-04