想想我可能在这里做错了什么,但我现在一直在坚持和寻找一两天,我只是想不出来。
我的解决方案中有一个可重复使用的WCF项目,以及一个特定于解决方案的MVC.NET项目。
解决方案: -
MVC.NET项目
班级图书馆
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);
}
});
所以为了重新迭代,请求正在进行,我可以在我的服务中点击断点,这意味着任何不需要参数的服务方法都可以,但对于那些需要参数的人来说,没有传递。
谁能看到我出错的地方?
答案 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.....)