具有 MVC.NET 终结点的 WCF - 不传递任何参数
本文关键字:任何 参数 WCF NET MVC 结点 具有 | 更新日期: 2023-09-27 18:32:30
认为我可能只是在这里做错了什么,但我已经坚持并搜索了一两天,我就是想不通。
我的解决方案中有一个可重用的 WCF 项目,以及一个特定于解决方案的 MVC.NET 项目。
溶液:-
-
MVC.NET 项目
-
类库
- 周转基金项目
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);
}
});
因此,重申一下,请求正在通过,我可以在我的服务中遇到断点,这意味着任何不需要参数的服务方法都可以,但是对于那些确实需要参数的服务方法,不会传递任何方法。
谁能看出我哪里出了问题?
请尝试以下操作:
data: JSON.stringify ({ systemName : "test", searchType : "test", query : "test", resultCount : "test", ipAddress : "test" }),
或
IEnumerable<Product> data = GetData(selectedCategory);
return Json(data, JsonRequestBehavior.AllowGet);
如我所见,您需要返回 json 数据。
报告服务调用 Web 服务方法时,我遇到了这个问题 - 我知道这是一个不同的场景,但解决方案可能是相同的。
经过几天的战斗,我发现问题是由 Web 服务命名空间中的尾随正斜杠引起的:
http://tempuri.org/
删除尾部斜杠为我解决了问题
http://tempuri.org
就像我说的,我的场景不同,但同样的症状 - 可能值得一试。
好的,我相信我已经设法解决了这个问题并通过了我的参数,但是情况并不理想。如果有人有更好的方法,请告诉我。
为了解决这个问题,我最终不得不将一个 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参数覆盖,但是这是一个完成应该相当简单的练习的冗长方法。
我觉得有更好的方法,所以如果有人能建议一个,我将不胜感激。
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.....)