1

サードパーティのアプリから呼び出す必要のあるWCFサービスがあり、生のXMLを投稿しています。

単純なWebRequestを作成し、サービスにリクエストを送信して、サービスをテストしようとしています。

これが私のサービスコードです:

インターフェース:

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

サービス:

    [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);
    }
}

構成:

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

障害のあるクライアントコード:

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

その最後の行で、指定したContentTypeに応じて、400(不正な要求)または415(サポートされていないメディアタイプ)エラーが発生します。

また、クライアントアプリにサービス参照を追加し、APIを使用してサービスを呼び出すと、正常に機能します。私はWCFを初めて使用し、完全に困惑しているので、洞察をいただければ幸いです。

4

2 に答える 2

7

ここで2つの異なることを混同していると思います:

  1. WebRequestおよび a属性はPOST[WebInvoke]REST のようなことをしようとしていることを示唆しています
  2. ただし、サービス構成にはbasicHttpBinding-飛ばないSOAPプロトコルがありますWebRequest

だから - 決心してください!

SOAP を使用しますか? 次に、basicHttpBinding はそのままで問題ありませんが、POST を使用して WebRequest からそのように SOAP サービスにアクセスすることはできません。Visual Studio またはsvcutil.exeコマンド ラインで生成された SOAP クライアントを使用する必要があります。

WebRequest と単純な POST 要求を使用しますか?? 次に、REST ベースの WCF サービスを作成する必要があります。(単純な ServiceHost ではなく)webHttpBindingとを使用します。WebServiceHost

SOAP ベースの WCF サービスについては、MSDN の WCF デベロッパー センターを参照してください。

REST ベースの WCF サービス (ブラウザーで移動でき、WebRequest から呼び出すことができます) については、MSDN の WCF REST デベロッパー センターを確認し、 REST ベースの開発に関するPluralsight による優れたスクリーンキャスト シリーズをご覧ください。 WCF - 最も注目すべき点:

于 2010-03-04T22:14:14.570 に答える
1

basicHttpBinding も適しています。

basicHttpBindingを使用した WCF サービスへの WebRequest の何が問題なのかを理解するのにほぼ 1 日を費やしましたが、小さいながらも重要なことを見逃していることが判明しました。

newRequest.Headers["SOAPAction"] = "http://tempuri.org/INotificationService/MyMethodName"
于 2012-07-17T16:12:51.707 に答える