带有MVC.NET端点的WCF - 没有传递参数?

时间:2013-09-24 12:31:17

标签: c# .net asp.net-mvc wcf

想想我可能在这里做错了什么,但我现在一直在坚持和寻找一两天,我只是想不出来。

我的解决方案中有一个可重复使用的WCF项目,以及一个特定于解决方案的MVC.NET项目。

解决方案: -

  • MVC.NET项目

  • 班级图书馆

  • WCF项目

WCF测试客户端获得预期结果。但是,当尝试通过MVC项目中设置的enpoints调用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 ,这些也不包含params。

我正在使用以下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 个答案:

答案 0 :(得分: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数据。

答案 1 :(得分:0)

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

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

http://tempuri.org/

删除尾部斜杠为我排序问题

http://tempuri.org

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

答案 2 :(得分: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参数覆盖,但是这是一个漫长的方式来完成应该是一个相当简单的练习。

我觉得有更好的方法,所以如果有人能提出建议,我会非常感激。

答案 3 :(得分:0)

 UriTemplate = "Search?systemName={systemName}&searchType={searchType}&query={query}&resultCount={resultCount}&ipAddress={ipAddress}")]

根据此属性,所有参数都应该由GET传递。

您的ajax请求网址应为“/ Api / Rest / Log / Search?systemName = aaaaa&amp; searchType = bbbb&amp; query = cccc&amp; resultCount = ddddd&amp; ipAddress = eeeee”

所以你需要改变的是改变你的客户端js。而不是使用Post json,而是使用GET传递params。

如果您尝试在此处使用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.....)