1

WindowsPhoneアプリからRestSharpを介して作成したセルフホストのWCFサービスに送信されるRESTリクエストに関して問題が発生しています。リクエストはエミュレーターで正常に機能し、リクエストは結果を返しますが、実際のデバイスのアプリでリクエストを実行しようとすると失敗し、リクエストは何も返しません。

かなりの量の調査を行った結果、明らかにwebHttpBindingがWindows Phoneでサポートされていないことがわかりました。そのため、basicHttpBindingエンドポイントをWeb.configファイルに追加する必要があります。ただし、これを実行しようとすると、複数のエンドポイントがあることに関連するいくつかのエラーが発生し、これらの両方を正常に機能させるための解決策が得られないようです。エンドポイントをbasicHttpBindingに切り替え、webHttpBindingをコメントアウトすると、localhost:81/mywebservice.svcに移動したときにエラーが発生します。

   "System.InvalidOperationException: For request in operation analyseFace to be a stream the operation must have a single parameter whose type is Stream." 

リクエストに添付する必要があるストリームを要求します。元のコードと同じアドレスを使用した通常のヘルプページが表示されます。

私のweb.configファイル

     <trace>
      <listeners>
        <add type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
          name="AzureDiagnostics">
          <filter type="" />
        </add>
      </listeners>
    </trace>
  </system.diagnostics>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- 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>
        <behavior name="servicebehavior">
          <!--<serviceMetadata httpGetEnabled="true"/>-->
          <serviceDebug includeExceptionDetailInFaults="true" httpHelpPageEnabled="true"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="restbehavior">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <services>
        <service behaviorConfiguration="servicebehavior" name="VizageAPIWebRole.vizage">
          <endpoint address="" behaviorConfiguration="restbehavior" binding="webHttpBinding" name="RESTEndPoint" contract="VizageAPIWebRole.Ivizage" />
          <!--<endpoint address="" binding="basicHttpBinding" contract="VizageAPIWebRole.Ivizage" />-->
        </service>
    </services>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
    <bindings>
      <webHttpBinding>
        <binding name="RestBinding">
          <readerQuotas maxStringContentLength="5242880" maxArrayLength="16384" maxBytesPerRead="4096" />
          <security mode="None">
          </security>
        </binding>
      </webHttpBinding>
    </bindings>
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>

私のWCFサービス

[ServiceContract]
public interface Ivizage
{
    [WebInvoke(UriTemplate = "/agerecog/{auth}", Method = "POST")]
    VizageResult analyseFace(string auth, Stream dataStream);

}

私が試したことでこれまで運がなかったので、誰かが私のweb.configで編集しなければならないコードを理解して、両方のエンドポイントでこれを機能させることができるかどうか疑問に思っています

4

2 に答える 2

1

コードはRESTサービスのようですが、basicHttpBindingはSOAPをサポートしています。したがって、引き続きwebHttpBindingを使用してください。ただし、Windows Phone側では、WCFを使用できません。RESTサービスにアクセスするには、WebClientまたはHttpWebRequestを使用する必要があります。WCFは、SOAPサービスへのアクセスに役立ちます。

さらに、アプリケーションはエミュレーターで正常に動作するため、コーディングの問題になる可能性は低いとおっしゃいました。実際の電話デバイスがインターネットにアクセスできるかどうかを確認できれば、より良いでしょう。また、127.0.0.1ではなくクラウドサービスのアドレスを使用していることを確認してください。ローカルアドレスは実際のデバイスでは機能しません。

よろしくお願いします、

明徐。

于 2012-05-01T06:42:56.273 に答える
0

例外と構成から、デフォルトでbasicHttpBindingを使用する簡略化された構成を使用しています。サービスエンドポイントを明示的に定義する必要があります

 <services>
      <service  name="WcfRest.Ivizage">
        <endpoint behaviorConfiguration="restbehavior" binding="webHttpBinding"
         contract="WcfRest.Ivizage" />
      </service>
 </services>

編集:webHttpはサポートされていないようです

于 2012-04-30T14:31:11.653 に答える