具有 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);
    }
});

因此,重申一下,请求正在通过,我可以在我的服务中遇到断点,这意味着任何不需要参数的服务方法都可以,但是对于那些确实需要参数的服务方法,不会传递任何方法。

谁能看出我哪里出了问题?

具有 MVC.NET 终结点的 WCF - 不传递任何参数

请尝试以下操作:

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.....)