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
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, du vermischt zwei verschiedene Sachen hier:
WebRequest
und einPOST
und die[WebInvoke]
- Attribut legt Sie zu tun versuchen, so etwas wie RUHEbasicHttpBinding
- eine SOAP-Protokolls, die nicht Fliegen mitWebRequest
So make up your mind!
Wollen Sie SEIFE verwenden? Dann bist du gut mit der "basicHttpBinding" so wie Sie ist, aber Sie keinen Zugriff auf einen SOAP-Dienst einfach so aus einem WebRequest mit der POST - Sie müssen zur Verwendung der SOAP-client erzeugt, die von Visual Studio oder
svcutil.exe
auf der Kommandozeile.Tun, die Sie verwenden möchten WebRequest und eine einfache POST-Anfrage?? Dann müssen Sie erstellen eine REST-basierte WCF - Dienst verwenden, der
webHttpBinding
und dieWebServiceHost
(im Gegensatz zu einem einfachen ServiceHost).Für SOAP-basierte WCF-Dienste, check-out die WCF Developer Center auf der MSDN-Website.
Für REST-basierte WCF-Dienste (die Sie navigieren können, um in Ihrem browser, und die Sie nennen können, die von WebRequest), überprüfen Sie die WCF REST-Developer Center auf der MSDN-Website und haben einen Blick auf die hervorragenden screencast-Serie von Pluralsight auf REST-basierte Entwicklung im WCF - insbesondere:
.. Und der Rest an videos sowie leider.
sorry, die links waren in Ordnung - in 2010, wenn ich geantwortet - aber du hast Recht, Sie scheinen tot zu sein wissen. Tut mir Leid, ich habe keine alternativen links..... versuchen Sie, Fragen Sie Google oder Bing, vielleicht??
Ich weiß, dass Sie schrieb die Antwort in 2010. Keine Notwendigkeit zu betonen. Wenn die links rot auf stackoverflow, die ich in der Regel lassen die OP wissen, da ich nicht nur wollen, um nach dem Zufallsprinzip update einige links zu anderen Ressourcen. Meine Absicht war, die links gibts irgendwie für andere Besucher als auch, nicht nur jetzt, für mich. Es tut mir Leid, wenn Sie nahmen Anstoß. Ich werde versuchen, Google.
InformationsquelleAutor marc_s
basicHttpBinding, ist auch geeignet!
Verbringe ich fast einen Tag herauszufinden, was falsch mit WebRequest zum WCF-Dienst mit basicHttpBinding, und es stellte sich heraus, verpasste ich den kleinen, aber entscheidenden Sache: SOAPAction header muss gesetzt werden!
WebRequest
. Habe es SOAPHeaders als gut.Sie meinen Wunsch stream? Sie können installieren http-proxy (wie z.B. Fiddler) und überprüfen, was gesendet wird in der WCF-service-Aufruf. Sie werden sehen-request-body und-Header. Ich musste vorwärts Anfrage in meiner Aufgabe, also nicht im Bau-request-body von mir.
InformationsquelleAutor ADOConnection