0

认为我可能只是在这里做错了什么,但我一直在坚持和寻找一两天,但我无法弄清楚这一点。

我的解决方案中有一个可重用的 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.CurrentWebOperationContext.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
 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

过去通过报告服务调用 web 服务方法时,我遇到过这个问题——我知道这是一个不同的场景,但解决方案可能是相同的。

经过几天的斗争,我发现问题是由 web 服务的命名空间中的斜杠引起的:

http://tempuri.org/

删除尾部斜杠为我解决了问题

http://tempuri.org

就像我说的,我的情况不同,但症状相同——可能值得一试。

于 2013-09-25T07:59:55.463 回答
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

好的,我相信我已经设法解决了这个问题并通过了我的参数,但是情况并不理想。如果有人有更好的方法,请告诉我。

为了解决这个问题,我最终不得不为每个方法附加一个 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 回答