0

要件に従って、Iphone から画像とファイル名を投稿するには、残りの WCF サービスが必要です。Rest サービスを作成しました。しかし、WCF サービスを実行すると、次のエラーが発生します。

An ExceptionDetail, likely created by IncludeExceptionDetailInFaults=true, whose value is:
System.InvalidOperationException: An exception was thrown in a call to a WSDL export extension: System.ServiceModel.Description.DataContractSerializerOperationBehavior
 contract: http://tempuri.org/:IService1 ----> System.InvalidOperationException: For request in operation PostImage to be a stream the operation must have a single parameter whose type is Stream.
   at System.ServiceModel.Dispatcher.StreamFormatter.ValidateAndGetStreamPart(MessageDescription messageDescription, Boolean isRequest, String operationName)
   at System.ServiceModel.Dispatcher.StreamFormatter.Create(MessageDescription messageDescription, String operationName, Boolean isRequest)
   at System.ServiceModel.Description.MessageContractExporter.ExportMessage(Int32 messageIndex, Object state)
   at System.ServiceModel.Description.MessageContractExporter.ExportMessageContract()
   at System.ServiceModel.Description.DataContractSerializerOperationBehavior.System.ServiceModel.Description.IWsdlExportExtension.ExportContract(WsdlExporter exporter, WsdlContractConversionContext contractContext)
   at System.ServiceModel.Description.WsdlExporter.CallExtension(WsdlContractConversionContext contractContext, IWsdlExportExtension extension)
   --- End of inner ExceptionDetail stack trace ---
   at System.ServiceModel.Description.WsdlExporter.CallExtension(WsdlContractConversionContext contractContext, IWsdlExportExtension extension)
   at System.ServiceModel.Description.WsdlExporter.CallExportContract(WsdlContractConversionContext contractContext)
   at System.ServiceModel.Description.WsdlExporter.ExportContract(ContractDescription contract)
   at System.ServiceModel.Description.WsdlExporter.ExportEndpoint(ServiceEndpoint endpoint, XmlQualifiedName wsdlServiceQName, BindingParameterCollection bindingParameters)
   at System.ServiceModel.Description.WsdlExporter.ExportEndpoints(IEnumerable`1 endpoints, XmlQualifiedName wsdlServiceQName, BindingParameterCollection bindingParameters)
   at System.ServiceModel.Description.ServiceMetadataBehavior.MetadataExtensionInitializer.GenerateMetadata()
   at System.ServiceModel.Description.ServiceMetadataExtension.EnsureInitialized()
   at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.InitializationData.InitializeFrom(ServiceMetadataExtension extension)
   at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.GetInitData()
   at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.TryHandleDocumentationRequest(Message httpGetRequest, String[] queries, Message& replyMessage)
   at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.ProcessHttpRequest(Message httpGetRequest)
   at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.Get(Message message)
   at SyncInvokeGet(Object , Object[] , Object[] )
   at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)
   at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41(MessageRpc& rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc& rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc& rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc& rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc& rpc)
   at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)

次のコードを使用しました

[OperationContract]
   [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare,
                    UriTemplate = "PostImage/{filename}",
                    Method = "POST")]
  string PostImage(string filename, Stream obj);


  public string PostImage(string filename, Stream obj)
  {
  }

そして、次の web.config を使用して

<system.serviceModel>
    <bindings>
      <webHttpBinding>
        <binding name="webHttpBindingStreamed" crossDomainScriptAccessEnabled="true" transferMode="Streamed" maxBufferSize="2147483647"  maxReceivedMessageSize="2147483647" openTimeout="00:25:00" closeTimeout="00:25:00" sendTimeout="00:25:00" receiveTimeout="00:25:00"></binding>
      </webHttpBinding>
    </bindings>

    <services>
      <service name="Test.Service1" behaviorConfiguration="ServiceBehaviour">
        <endpoint address="" 
                  binding="webHttpBinding" 
      contract="Test.IService1" 
      behaviorConfiguration="webHttp"
      bindingConfiguration="webHttpBindingStreamed"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehaviour">
          <!-- To avoid disclosing metadata information, set the values below to false 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="true" />
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="webHttp" >
          <webHttp automaticFormatSelectionEnabled="true" defaultOutgoingResponseFormat="Json"/>
        </behavior>
      </endpointBehaviors>
    </behaviors>


    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>

私はこのエラーに苦労しています。誰でもこのエラーについて何か考えがあります。前もって感謝します。

4

1 に答える 1

0

このブログでは、REST サービスでこのエラーがスローされる理由について説明しています。http://blogs.msdn.com/b/hongmeig/archive/2010/03/02/how-to-solve-system-invalidoperationexception-for-request-in-operation-test-to-be-a-stream-操作には、単一のパラメーターが必要です。その型は、stream.aspx です。

[ブログからの抜粋] これが REST エンドポイントである場合、REST には複数のパラメーターを正しく処理する独自のフォーマッターがあるため、このプログラミング モデルは実際にサポートされます。ただし、この問題が引き続き発生する場合は、WebHttpBehavior が正しく設定されていることを確認してください。その動作が正しく設定されていない理由として、次のことが考えられます。

  1. カスタム動作を使用していますが、そのエンドポイントには、WCF コントラクトと一致する正しいコントラクト名がありません。

  2. WebEndpoint または WebServiceHost を使用していません。

バインディングの TransferMode で Buffered オプションを選択することで、この問題を回避することもできます。しかし、それはストリーミングの目的全体を無効にしているようです.

質問: サービス ホストは WebServiceHost ですか?

于 2012-11-17T02:22:30.357 に答える