如何访问在类库中创建的Web服务?

时间:2015-01-30 20:55:50

标签: c# asp.net class-library asp.net-4.5

我首先在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服务?

1 个答案:

答案 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
});