Versuchen, rufen Sie einen WCF-Dienst mit einem WebRequest

Ich habe einen WCF-Dienst, der aufgerufen werden muss, durch eine 3rd-party-app, die Entsendung von einigen XML-Rohdaten.

Ich versuche zu testen, meinen Dienst, indem er eine einfache WebRequest und die Anfrage an den service.

Hier mein service code:

Schnittstelle:

    [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>

fehlerhafte client-code:

            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();

Auf die Letzte Zeile bekomme ich einen 400 (Bad Request) oder 415 (Unsupported Media Type) Fehler, je nachdem, welche ContentType angeben ich.

Auch, wenn ich auf add service reference in meine client-app, und rufen Sie den Dienst über die API funktioniert es einwandfrei. Eine Einsicht wäre sehr geschätzt, wie ich bin neu in WCF und völlig ratlos.

Was ich tun würde: Fiddler fiddler2.com/fiddler2 zu sehen, die Anfrage für die "API" - die eine, die funktioniert. Dann vergleichen Sie es mit dem Wunsch, das funktioniert nicht. Das sollte einzugrenzen.
Ihre StreamReader muss in einem using block, wie mehrere andere Objekte. Ein using block wird dazu führen, dass Sie entsorgt werden, auch wenn eine exception geworfen wird.

InformationsquelleAutor Seth | 2010-03-04

Schreibe einen Kommentar