我首先在ASP.net项目中创建了一个Web服务,然后将其代码移动到类库到CSharp(.cs)文件。
我还在这个新创建的类中添加了“IHttpHandlerFactory”的实现,以便我可以在web.config文件中注册此服务:
public class Test: WebService, IHttpHandlerFactory
{
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string Hello(string world)
{
return "Hello " + world;
}
private static WebServiceHandlerFactory wshf = new WebServiceHandlerFactory();
private static MethodInfo coreGetHandlerMethod = typeof(WebServiceHandlerFactory).GetMethod("CoreGetHandler", BindingFlags.Instance | BindingFlags.NonPublic);
public System.Web.IHttpHandler GetHandler(System.Web.HttpContext context, string requestType, string url, string pathTranslated)
{
return (IHttpHandler)coreGetHandlerMethod.Invoke(wshf, new object[] { GetType(), context, context.Request, context.Response });
}
public void ReleaseHandler(IHttpHandler handler)
{
}
}
并在web.config中注册:
<add name="TestService" path="TestService.asmx" verb="*" type="MyApp.Library.Test, MyApp.Library, Version=1.0.0.0, Culture=neutral" preCondition="integratedMode" />
我可以在这里访问它:
http://localhost:8090/TestService.asmx
使用浏览器时效果很好。
我之前正在进行ajax调用。我只需要更改服务的网址:
/TestService.asmx
现在,当使用ajax调用服务时,会产生错误:
System.InvalidOperationException: Request format is invalid: application/json; charset=utf-8.
at System.Web.Services.Protocols.HttpServerProtocol.ReadParameters()
at System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest()
我确实
contentType: "application/json; charset=utf-8",
在jQuery Ajax Call中。在经历了数小时的挫折之后,我找到了一个指向此页面的链接,该链接实际上解决了这个问题:
http://www.springframework.net/doc-latest/reference/html/webservices.html
因为我已经在使用城堡windsor,所以我不想为spring任务添加额外的依赖。
如何在ASP.net网页中访问在类库项目上创建并在web.config中注册的Web服务?
答案 0 :(得分:1)
我正在回答我自己的问题,以便任何遇到这个问题的人都不必撞墙。似乎在类库项目(.net Framework 4.5.1)上创建的WebService将忽略参数:
ResponseFormat = ResponseFormat.Json
即使您将JSON指定为响应格式,它仍将使用XML对象进行响应。
所以,我改变了解决问题的要求。
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Xml)]
public string Hello(string world)
{
return "Hello " + world;
}
在javascript部分
$.post(url, function (result) {
//result is an XML object
});