0

シンプルな XML をサービスにポストするシンプルな WCF POST があります。

これがサービス契約です。

[ServiceContract]
public interface ITest
{
    [OperationContract]
    [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "PostTest")]
   Stream PostTest(Stream testInfo);  
}

そして、構成、空想は何もありません。

<system.serviceModel>
<services>
  <service name="T.Test" behaviorConfiguration="ServiceBehaviour">
    <!-- Service Endpoints -->
    <!-- Unless fully qualified, address is relative to base address supplied above -->
    <endpoint address ="" binding="webHttpBinding" contract="T.ITest" behaviorConfiguration="web">
      <!-- 
          Upon deployment, the following identity element should be removed or replaced to reflect the 
          identity under which the deployed service runs.  If removed, WCF will infer an appropriate identity 
          automatically.
      -->
    </endpoint>
  </service>
</services>

<behaviors>
  <serviceBehaviors>
    <behavior name="ServiceBehaviour">
      <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
      <serviceMetadata httpGetEnabled="true"/>
      <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
      <serviceDebug includeExceptionDetailInFaults="false"/>
    </behavior>
  </serviceBehaviors>
  <endpointBehaviors>
    <behavior name="web">
      <webHttp/>
    </behavior>
  </endpointBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />

コンテンツ タイプについて言及しない限り、単純なクライアントからテストするとすべてが機能します。

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
            req.Method = "POST";

req.ContentType = "text/xml; charset=utf-8";

var xmlDoc = new XmlDocument { XmlResolver = null };
xmlDoc.Load("../../PostData.xml");
string sXml = xmlDoc.InnerXml;
Console.Write(sXml + Environment.NewLine + Environment.NewLine);

req.ContentLength = sXml.Length;
var sw = new StreamWriter(req.GetRequestStream());
sw.Write(sXml);
sw.Close();

HttpWebResponse res = (HttpWebResponse)req.GetResponse();

いくつかの調査の後、これは SOAP 1.1 と SOAP 1.2 の間の互換性の問題であることがわかりました。しかし、サーバー側でこれを修正するにはどうすればよいですか?

4

2 に答える 2

0

これには、WCF http://vivekcek.wordpress.com/2012/06/14/wcf-rest-service-accepting-raw-xml-webcontenttypemapper/のコンテンツ タイプを受け入れるための正確なソリューションがあります。

于 2013-06-17T21:38:56.833 に答える
0

webHttpBindingSOAPバインディングではなくRESTバインディングであるため、SOAPバージョンの問題とは関係ないと思います

要求にヘッダーを設定するContentTypeと、クライアントが要求されたコンテンツ タイプで応答する必要があることがサービスに伝えられます。実際にどのようなコンテンツ タイプで応答しますか? そうでない場合はtext/xml; charset=utf-8、それがエラーを説明している可能性があります。

ドキュメントによると、デフォルトの応答ContentTypewebHttpBindingapplication/xmlまたはapplication/octet-streamストリーミングされた応答です。

で何も指定しない場合、フィドラーはヘッダーがに設定されていることを通知contentTypeしますHttpWebRequestContentTypetext/html, application/xhtml+xml, */*

ワイルドカードはapplication/octet-stream、サーバーが応答している を含め、どの応答タイプでも OK であることを意味します。これが、コンテンツ タイプを設定しない場合に機能する理由です。

クライアントContentTypeヘッダーを に設定するとすぐにtext/xml、サービスが応答しているものと一致しなくなるため、エラーが発生します。

クライアントでリクエスト ContentType を設定できない場合は、サーバーで設定する必要があります。この投稿は、その方法に関するリンクを提供します

WCF REST WebService コンテンツ タイプが正しくありません

そして、これはいくつかのより多くの情報を提供します

http://msdn.microsoft.com/en-us/library/ee476510.aspx

于 2013-06-17T19:11:32.510 に答える