4

jQuery を使用して WCF サービスを呼び出そうとすると、次のエラーが発生します。

"Cannot process the message because the content type 
'application/json; charset=utf-8' was not the expected type 'multipart/related; 
type="application/xop+xml"'."

これは私のWCFサービスがどのように見えるかです:

インターフェース:

public interface IService
{

    [OperationContract]
    [WebInvoke(Method = "POST",
      ResponseFormat = WebMessageFormat.Json)]
    PhotoServiceResponse GetPhoto();

}

[DataContract]
public class PhotoServiceResponse
{
    [MessageBodyMember]
    public Byte[] Photo { get; set; }
}

実装:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class Service : IService
{
    #region IService Members


    public PhotoServiceResponse GetPhoto()
    {
        PhotoServiceResponse response = new PhotoServiceResponse();
        response.Photo = File.ReadAllBytes(@"C:\Temp\SomePic.bmp");
        return response; 
    }

    #endregion
}

構成:

<system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="WsHttpMtomBinding" maxReceivedMessageSize="5242880" messageEncoding="Mtom">
          <readerQuotas maxStringContentLength="655360" maxArrayLength="1310720" maxNameTableCharCount="1310720" maxBytesPerRead="327680" />
        </binding>

      </wsHttpBinding>
    </bindings>

    <behaviors>
      <serviceBehaviors>
        <behavior name="svcBehaviour">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>

    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />

    <services>
      <service behaviorConfiguration="svcBehaviour"
               name="Service">
        <endpoint address="" binding="wsHttpBinding"
           contract="IService"
           bindingConfiguration="WsHttpMtomBinding"/>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8081/Service" />
          </baseAddresses>
        </host>
      </service>
    </services>
  </system.serviceModel>

これは、jQuery AJAXを使用してこのサービスにアクセスしようとしている方法です:

   <script type="text/javascript">
    $.ajax({
      type: "POST",
      contentType: "application/json; charset=utf-8",
      url: "http://localhost:8081/Service/GetPhoto",
      data: "{}",
      crossDomain: true,
      dataType: "json",
      success: function (msg) {
            alert(msg);
      },
      error: function(jqXHR)
      {
        alert(jqXHR.statusText);
      }
    });

    </script>

このエラーが発生する理由は何ですか? どうすれば修正できますか?

どんな助けでも彼は高く​​評価します。

4

3 に答える 3

4

バインディングなどで間違いを犯しているため、例外に直面していると思います。

WCF での REST 通信には、 ではwebHttpBindingなく を使用する必要がありwsHttpBindingます。次に、Photoプロパティを でマークする必要がありますDataMember

  [DataContract]
  public class PhotoServiceResponse
  {
    [DataMember]
    public Byte[] Photo { get; set; }
  }

System.ServiceModel.Activation.WebServiceHostFactoryまた、svc ファイルでを使用する必要があります。

元。

<%@ ServiceHost Service="Service1" 
Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>

この問題を修正すると、少なくともクライアント側でいくつかの応答が表示されます。サービスが別のドメインで実行されている場合は、クロスサイト通信のためにサービス側で十分な設定を行っていることを確認してください。

于 2012-06-12T08:06:39.833 に答える
1

あなたのコードを本当に読み違えていない限り、Ajax 経由でファイルをバイト配列として返そうとしているようです。これにはいくつかの問題があります。まず第一に、Ajax 戻り型の jQuery API リファレンス で説明されているように、 jQuery の組み込み Ajax オブジェクトを使用して Ajax 経由でファイルを返すことはできないようです。2 つ目 (もう少し主観的なことですが)、ファイルに URL を返さないのはなぜでしょうか。やむを得ない理由がない限り、Ajax の結果でファイルの URL を返します。

于 2012-06-11T20:34:52.793 に答える