0

ここで何か間違ったことをしているのかもしれないと思いますが、1日か2日粘り強く検索してきましたが、これを理解することはできません.

ソリューション内に再利用可能な WCF プロジェクトがあり、それに加えてソリューション固有の MVC.NET プロジェクトがあります。

解決: -

  • MVC.NET プロジェクト

  • クラス ライブラリ

  • WCF プロジェクト

WCF テスト クライアントは、期待どおりの結果を取得します。ただし、MVC プロジェクトでセットアップされたエンポイントを介して WCF サービスを呼び出そうとすると、いくつかの問題が発生します。ユーザーからパラメーターが渡されない場合、正常に動作します。ただし、パラメーターを Web サービスに渡そうとすると、.svc ファイル内で使用できるものはないようです。

私のエンドポイントコード:

public override void RegisterArea( AreaRegistrationContext context ) {

    context.Routes.Add( new ServiceRoute( "Api/SOAP/Log", new ServiceHostFactory(), typeof( Log ) ) );
    context.Routes.Add( new ServiceRoute( "Api/SOAP/Report", new ServiceHostFactory(), typeof( Report ) ) );

    context.Routes.Add( new ServiceRoute( "Api/Rest/Log", new WebServiceHostFactory(), typeof( Log ) ) );
    context.Routes.Add( new ServiceRoute( "Api/Rest/Report", new WebServiceHostFactory(), typeof( Report ) ) );

}

サービス契約:

[ServiceContract]
public interface ILog {

    [OperationContract]
    [WebInvoke( Method = "POST", UriTemplate = "Search?systemName={systemName}&searchType={searchType}&query={query}&resultCount={resultCount}&ipAddress={ipAddress}")]
    SearchResult Search( string systemName, string searchType, string query, string resultCount, string ipAddress );

}

および svc サービス:

パブリック クラス ログ : ILog {

public void Search( string systemName, string searchType, string query, string resultCount, string ipAddress ) {

    LogSearch Manager = new LogSearch();
    Manager.ProcessWcfRequest( systemName, searchType, query, resultCount, ipAddress);

}

}

これらのパラメーターは明らかに通過していません。また、実行時にSystem.Web.HttpContext.CurrentおよびWebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParametersを検査しようとしましたが、これらにはパラメーターも含まれていません。

次の AJAX リクエストを使用してリクエストを作成しています。

jQuery.ajax({
    type: "POST",
    contentType: "application/json; charset=utf-8",
    url: "/Api/Rest/Log/Search",
    dataType: "json",
    data: { systemName : "test", searchType : "test", query : "test", resultCount : "test", ipAddress : "test" },
    success: function (msg) {
        console.log(msg);
    }
});

つまり、パラメーターを必要としないサービス メソッドは問題ありませんが、パラメーターを必要とするサービス メソッドには何も渡されません。

誰かが私が間違っているところを見ることができますか?

4

4 に答える 4

0

以下を試してください:

data: JSON.stringify ({ systemName : "test", searchType : "test", query : "test", resultCount : "test", ipAddress : "test" }),

また

IEnumerable<Product> data = GetData(selectedCategory);
return Json(data, JsonRequestBehavior.AllowGet);

ご覧のとおり、jsonデータを返す必要があります。

于 2013-09-24T12:56:49.037 に答える
0
 UriTemplate = "Search?systemName={systemName}&searchType={searchType}&query={query}&resultCount={resultCount}&ipAddress={ipAddress}")]

この属性によると、すべてのパラメーターは GET によって渡されることになっています。

ajax リクエスト URL は「/Api/Rest/Log/Search?systemName=aaaaa&searchType=bbbb&query=cccc&resultCount=ddddd&ipAddress=eeeee」である必要があります。

したがって、ここで変更する必要があるのは、クライアント js を変更することだけです。Post json を使用する代わりに、代わりにパラメーターを渡す GET を使用します。

ここで POST を使用しようとする場合は、この方法でサービス コントラクトを定義します。

[OperationContract]
    [WebInvoke(UriTemplate = "Search", <== CHANGE HERE 
     Method = "POST", 
     BodyStyle = WebMessageBodyStyle.WrappedRequest, 
     RequestFormat = WebMessageFormat.Json,   <== ADD THIS HERE TO YOUR CODE 
     ResponseFormat = WebMessageFormat.Json <== ADD THIS HERE TO YOUR CODE )]
   SearchResult Search( string systemName, string searchType, string query, string resultCount.....)
于 2013-09-25T09:34:48.320 に答える
0

わかりました、これを解決してパラメーターを取得できたと思いますが、状況は実際には理想的ではありません. 誰かがより良いアプローチを持っている場合は、私に知らせてください。

これを解決するために、各メソッドに Stream オブジェクトをアタッチする必要がありました。下記参照:

契約:

void Search( string systemName, string searchType, string query, string resultCount, string ipAddress, Stream postData );

サービス:

public void Search( string systemName, string searchType, string query, string resultCount, string ipAddress, Stream postData ) {

次に、サービス内でこれを実行できます。

NameValueCollection MyParams = HttpUtility.ParseQueryString( new StreamReader( postData ).ReadToEnd() );

if( MyParams[ "systemName" ] != null && MyParams[ "systemName" ].Length > 0 ) {
    systemName = MyParams[ "systemName" ];
}

if( MyParams[ "searchType" ] != null && MyParams[ "searchType" ].Length > 0 ) {
    searchType = MyParams[ "searchType" ];
}

if( MyParams[ "query" ] != null && MyParams[ "query" ].Length > 0 ) {
    query = MyParams[ "query" ];
}

if( MyParams[ "resultCount" ] != null && MyParams[ "resultCount" ].Length > 0 ) {
    resultCount = MyParams[ "resultCount" ];
}

if( MyParams[ "ipAddress" ] != null && MyParams[ "ipAddress" ].Length > 0 ) {
    ipAddress = MyParams[ "ipAddress" ];
}

これにより、望ましい結果が得られ、すべての GET パラメータがすべての POST パラメータによって上書きされることを意味します。

もっといい方法があると思うので、どなたか教えていただけると助かります。

于 2013-09-25T09:28:08.353 に答える