2

post メソッドを使用してレスト サービスを呼び出すことができず、エンドポイントが見つからないというエラーが発生し続けます。以下のコード:

[ServiceContract]
public interface IService1
{
    [OperationContract]
    [WebInvoke(
    Method = "POST",
    UriTemplate = "GetData",
    BodyStyle = WebMessageBodyStyle.WrappedRequest, ResponseFormat = WebMessageFormat.Json
    )]
    string GetData(string value);
}


[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class Service1 : IService1
{
    public string GetData(string value)
    {
        return value;
    }
}

web.config

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
    <httpRuntime maxUrlLength="1048576" relaxedUrlToFileSystemMapping="true" />
  </system.web>
  <system.serviceModel>

    <protocolMapping>
      <add scheme="http" binding="webHttpBinding" />
    </protocolMapping>

    <services>
      <service name="RestPost.Service1" behaviorConfiguration="default">
        <endpoint address="" behaviorConfiguration="web" binding="webHttpBinding"  contract="RestPost.IService1" />
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="web"  >
          <webHttp />
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="default">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>

    <bindings>
      <!-- default binding configration used for all REST services -->
      <webHttpBinding>
        <!-- max allowed message size incresed to 500 000 Bytes -->
        <binding maxBufferSize="95000000" maxReceivedMessageSize="95000000" />
      </webHttpBinding>
    </bindings>

    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>


   <security>
     <requestFiltering>
       <requestLimits maxUrl="40960000" maxQueryString="20480000" maxAllowedContentLength="20480000" />
     </requestFiltering>
   </security>
  </system.webServer>

</configuration>

これは、ブラウザでURLを呼び出す方法です

http://localhost:57395/Service1.svc/getdata/large base64encoded string here

これは私がフィドラーでそれを呼び出す方法です ここに画像の説明を入力

これを Casini で実行しようとしています。最終的には IIS 7.5 に展開されます。

base64 でエンコードされた大きな文字列を渡す理由が気になる場合は、JSON 形式でリクエストを送信する必要があるため、そうしています。JSON には IIS がすぐに拒否する特殊な文字があるため、URLencode を使用してみました。これに関する問題は、1000 文字程度を超えることができないことです。長さには有限の制限があります。Base64 エンコーディングと post の使用が唯一の方法でした。そのため、このコードを使用しています。

この Rest サービスの当初の目標は、このサービスに JSON を投稿し、その代わりに JSON 応答を取得する JavaScript ベースのクライアントを提供できるようにすることです。xml 文字列パディングのない純粋な JSON 応答。

残りのサービスへの投稿を機能させるには、助けが必要です。

4

1 に答える 1

1

ブラウザ経由で呼び出すと失敗する理由:ブラウザはGETリクエストではなくリクエストを行っていPOSTます。

Fiddler経由で呼び出すと失敗する理由:コンテンツタイプは「application / x-www-form-urlencoded」ですが、コンテンツはそうではありません(base64ブロブです)。うまくフォーマットされたフォームurlencodedデータ(などa=foo&b=bar)があったとしても、WCFはこのフォーマットをすぐにサポートしていないため、それでも機能しません(拡張ポイントの一部を使用して、サポートしますが、より多くの作業が必要です)。

あなたがする必要があること:あなたの操作はstringパラメータを期待しています。Fiddlerでは、データのbase64エンコーディングをJSON文字列として渡すことができます(つまり、データをラップします")。また、正しいコンテンツタイプを設定します。

POST http://localhost:57395/Service1.svc/getdata
Content-Type: application/json
Host: localhost:57395
Content-Length: <the appropriate length; fiddler will set it for you>

"large base64 string here"
于 2012-12-29T16:17:25.377 に答える