自托管的WCF服务的ServiceReference

3

我目前正在维护和开发一个使用大量Web服务以Ajax方式运行的网站。

服务的注册在aspx中是这样完成的:

<asp:ScriptManagerProxy id="ScriptManager1" runat="server">
        <services>    
            <asp:ServiceReference Path="WebServices/WSAdministrator.asmx"></asp:ServiceReference>
        </services>
</asp:ScriptManagerProxy>

在JavaScript中使用这些服务的方法如下

WSAdministrator.GetConsumerClubInfo(ConsumerClubId,
                                    OnSucceededToGetConsumerClubInfo,
                                    OnFailedToGetConsumerClubInfo);

我想知道是否可以轻松地引用同一台机器上托管的WCF服务。

有什么建议吗?

编辑:WCF服务正在运行Windows服务上,它公开了webHttpBinding和basicHttpBinding终结点。

阅读ASP.Net WCF Service with no App_Code后,我意识到应该创建一个svc文件,它将作为对服务的引用。

我创建了这个svc文件:

<%@ ServiceHost Language="C#" Service="MyService.Namespace.Contract" %>

并且我在web.config文件中添加了以下几行:

        <services>
        <service name="MyService.Namespace.Contract">
            <endpoint address="setAddress" binding="basicHttpBinding" contract="MyService.Namespace.ContractInterface"/>
        </service>
    </services>

地址可以正常使用,但是当我尝试从svc访问引用时,出现以下错误:
“ServiceHost指令中提供的服务属性值为''的类型找不到。”
我错过了什么吗?
注:有一些很好的答案,但都是我已经知道的事情,我的问题是如何引用我的自托管WCF服务,以便我可以从javascript中使用它,就这样,对此我仍然没有答案...
我看到一些回复类似的问题告诉应该有一个IIS托管的服务作为实际服务的“管道”,然后ScriptManager应该引用它,也许这是唯一的答案...

我认为您可能将启用AJAX的WCF服务与通过AJAX调用WCF服务混淆了? - Tim
嗯...也许是吧?最终我只想从JavaScript调用一个WCF Web服务,就像问题中所写的那样。通过引用asmx文件,可以使用asmx Web服务,但现在我不知道要写什么ServiceReference,因为我没有svc文件。 - Mithir
你是在建议添加basicHttpBinding端点,然后添加一个ServiceReference到地址吗?我觉得这里有些东西丢失了... - Mithir
不,我建议尝试添加您的服务正在侦听的URI(在Windows服务的app.config文件中定义或在服务主机中以编程方式定义),看看是否有效。您的Windows服务托管的WCF的终结点地址是什么? - Tim
你在 Service 属性中放置的 MyService.Namespace.Contract 是否正确? - Tim
显示剩余3条评论
2个回答

5
当您自行托管WCF服务时,不使用.SVC文件,而是在Windows服务的OnStart方法中创建服务主机,方法如下。
WebServiceHost myServiceHost = null;
if (myServiceHost != null)
{
    myServiceHost.Close();
}

myServiceHost = new WebServiceHost(typeof(YourClassName));
myServiceHost.Open();

如果您想要托管支持 WebHttpBinding 的服务,那么托管类应该是 WebServiceHost,如果您想要托管 wsHttpBinding 或任何其他类型的服务,则应使用 ServiceHost。
一旦服务开始运行,客户端就可以连接到它。
以下link包含逐步完成此操作的过程。
如果您需要支持能够使用 AJAX 和 Jquery 进行通信的 RESTful 服务,则应选择 WebServiceHost,并按照以下方式装饰您的操作合同。
[ServiceContract()]
public interface IMyInterface
{
   [OperationContract]
   [WebInvoke(Method = "GET",
   ResponseFormat = WebMessageFormat.Json,
   UriTemplate = "GetArray",
   BodyStyle = WebMessageBodyStyle.Bare)]
   MyArray[] GetArray();
} 

你甚至可以在以下问题中找到一些相关信息。


请点击以下链接:http://msdn.microsoft.com/en-us/library/dd203052.aspx。如果没有看到您的代码,很难找出问题所在。 - coolcake
您需要RESTful WCF服务才能使用JavaScript调用您的应用程序。 - coolcake
我很乐意放置任何需要的代码片段,但我不确定在这里放什么,因为正如我所说,服务正在运行,我认为这是一个配置问题。关于您的第二条评论,ASP.NET使得可以引用本地Web服务,然后在JavaScript中使用它,因此它不必是RESTful服务。 - Mithir
我对你想要的东西感到困惑。或者说我没有理解你的问题。如果你想通过代理访问服务,那么不需要使用RESTful服务,你是正确的。 - coolcake
你说服务运行在Windows服务中,你想在ASP.net项目中引用它吗? - coolcake
显示剩余4条评论

2
当然可以,使用WCF的话看起来会像这样:
<asp:ServiceReference Path="~/WSAdministrator.svc" />

请参考这里这里,了解一些相关的示例。


我不确定是否做错了什么...但是WCF是自托管的,而且我没有svc文件... - Mithir
你有没有想过,当没有svc文件但WCF服务是自托管在同一台机器上的IIS时该怎么办? - Mithir
“.svc” 文件是用于在 IIS 或 Windows Activation Services(WAS) 中托管 WCF 服务的文件。您是否有任何阻止您在托管服务时使用这两个选项的问题? - Illuminati
我在我的问题中发布了一些新信息,希望它能帮助你帮助我 :) - Mithir
你确定 svc 文件只是在 IIS 托管时才有用吗?我在问题中提供的链接说它也可以指代不在 IIS 上的代码。无论如何,服务需要自托管,因为它与 IIS 无关。 - Mithir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接