WCF - 在ASP.NET应用程序中具有多个.svc服务

时间:2013-02-12 12:46:56

标签: c# asp.net wcf jquery wcf-binding

我在Visual Studio 2010中创建了一个C#/ ASP.NET应用程序,并在其中创建了一个service.svc文件和相应的

  • IService.cs //合同
  • Service.cs //合同的实施 - 接口

并且此WCF服务以JSON格式返回我的数据。我用jQuery ajax帖子点击它。这项服务似乎按照我的意愿运作但后来我决定添加第二项服务,即ServiceNew.svc及其相应的

  • IServiceNew.cs //合同
  • ServiceNew.cs //合同的实施 - 接口

并在web.config

中添加相应的端点

在我添加第二个WCF服务后,没有任何服务工作,它返回500内部服务器错误。

最奇怪的部分是,如果我从我的应用程序的文件夹中删除所有新文件ServiceNew.svcIServiceNew.csServiceNew.cs,当我点击时,第一个Service.svc正常工作他们像以前一样使用jQuery帖子,然后如果我只是将这些文件再次复制回我的文件夹并运行Visual Studio主机,那么我的服务(旧的和新的)的两个工作随机一段时间,然后他们再次突然返回500当我用jQuery ajax调用命中它时出错。

我的web.config是:

<system.serviceModel>       
   <behaviors>
     <serviceBehaviors>
       <behavior name="ServiceBehavior">
         <serviceMetadata httpGetEnabled="true"/>
         <serviceDebug includeExceptionDetailInFaults="true"/>
       </behavior>
     </serviceBehaviors>
     <endpointBehaviors>
       <behavior name="EndpBehavior">
         <webHttp/>
       </behavior>
     </endpointBehaviors>
   </behaviors>
   <services>
     <service behaviorConfiguration="ServiceBehavior" name="Service">
       <endpoint address="" binding="webHttpBinding"
           contract="IService" behaviorConfiguration="EndpBehavior"/>
     </service>
     <service behaviorConfiguration="ServiceBehavior" name="ServiceNew">
       <endpoint address="" binding="webHttpBinding"
           contract="IServiceNew" behaviorConfiguration="EndpBehavior"/>
     </service>
   </services>
 </system.serviceModel>

IService.cs

[ServiceContract]
public interface IService
{
    [OperationContract]
    [WebInvoke(Method = "POST",
 ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)]
    [return: MessageParameter(Name = "d")]
    MovieInfo GetMovieInfo(string title, string year);
}

Service.cs

[AspNetCompatibilityRequirements(RequirementsMode
    = AspNetCompatibilityRequirementsMode.Allowed)]
public class Service: IService
{
    public MovieInfo GetMovieInfo(string title, string year)
    {
          ...
          return MovieInfo();
        }
}

类似地

IServiceNew.cs

[ServiceContract]
public interface IServiceNew
{
    [OperationContract]
    [WebInvoke(Method = "POST",
 ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)]
    [return: MessageParameter(Name = "d")]
    string GetConf();
}

ServiceNew.cs

[AspNetCompatibilityRequirements(RequirementsMode
    = AspNetCompatibilityRequirementsMode.Allowed)]
public class ServiceNew: IServiceNew
{
    public string GetConf()
    {
          ...
          return conf;
        }
}

有人能告诉我我做错了什么吗?我如何在ASP.NET应用程序中添加多个WCF服务(.svc文件),以便使用jQuery ajax调用来实现它们?

我的web.config出了什么问题?

是否还有别的什么?

由于

更新

作为更新,我可以说当我尝试调试其中一个.svc文件时,让我们在浏览器中说出ServiceNew.svc,显示以下异常:

无法加载文件或程序集&#39; App_Web_oq2tdtg4,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null&#39;或其中一个依赖项。系统找不到指定的文件。

堆栈追踪:

[FileNotFoundException:无法加载文件或程序集&#39; App_Web_oq2tdtg4,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null&#39;或其中一个依赖项。该系统找不到指定的文件。]    System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName,String codeBase,Evidence assemblySecurity,RuntimeAssembly locationHint,StackCrawlMark&amp; stackMark,Boolean throwOnFileNotFound,Boolean forIntrospection,Boolean suppressSecurityChecks)+0    System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName,String codeBase,Evidence assemblySecurity,RuntimeAssembly locationHint,StackCrawlMark&amp; stackMark,Boolean throwOnFileNotFound,Boolean forIntrospection,Boolean suppressSecurityChecks)+39    System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef,Evidence assemblySecurity,StackCrawlMark&amp; stackMark,Boolean forIntrospection,Boolean suppressSecurityChecks)+132    System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString,Evidence assemblySecurity,StackCrawlMark&amp; stackMark,Boolean forIntrospection)+144    System.Reflection.Assembly.Load(String assemblyString)+28    System.ServiceModel.Activation.ServiceHostFactory.CreateServiceHost(String constructorString,Uri [] baseAddresses)+210    System.ServiceModel.HostingManager.CreateService(String normalizedVirtualPath)+1461    System.ServiceModel.HostingManager.ActivateService(String normalizedVirtualPath)+44    System.ServiceModel.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath)+651

[ServiceActivationException:服务&#39; /ServiceNew.svc'由于编译期间的异常,无法激活。异常消息是:无法加载文件或程序集&#39; App_Web_oq2tdtg4,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null&#39;或其中一个依赖项。该系统找不到指定的文件..]    System.Runtime.AsyncResult.End(IAsyncResult result)+687598    System.ServiceModel.Activation.HostedHttpRequestAsyncResult.End(IAsyncResult result)+190    System.ServiceModel.Activation.HostedHttpRequestAsyncResult.ExecuteSynchronous(HttpApplication context,String routeServiceVirtualPath,Boolean flowContext,Boolean ensureWFService)+234    System.ServiceModel.Activation.HttpHandler.ProcessRequest(HttpContext context)+24    System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()+100    System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean&amp; completedSynchronously)+75

装配加载跟踪:

以下信息有助于确定程序集“App_Web_oq2tdtg4,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null&#39;无法加载。

===预绑定状态信息=== 日志:用户= ZULUTRADE \ stassis 日志:DisplayName = App_Web_oq2tdtg4,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null  (完全指定的) 日志:Appbase = file:/// C:/ Users / stassis / Documents / Development / theDreamBox / 日志:初始PrivatePath = C:\ Users \ stassis \ Documents \ Development \ theDreamBox \ bin

调用程序集:(未知)。

日志:此绑定在默认加载上下文中启动。 日志:使用应用程序配置文件:C:\ Users \ stassis \ Documents \ Development \ theDreamBox \ web.config 日志:使用主机配置文件: 日志:使用C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ config \ machine.config中的计算机配置文件。 日志:此时策略未应用于引用(私有,自定义,部分或基于位置的程序集绑定)。 日志:尝试下载新的URL文件:/// C:/ Users / stassis / AppData / Local / Temp / Temporary ASP.NET Files / root / 87ef3319 / ec80b2f5 / App_Web_oq2tdtg4.DLL。 日志:尝试下载新的URL文件:/// C:/ Users / stassis / AppData / Local / Temp / Temporary ASP.NET Files / root / 87ef3319 / ec80b2f5 / App_Web_oq2tdtg4 / App_Web_oq2tdtg4.DLL。 日志:尝试下载新的URL文件:/// C:/Users/stassis/Documents/Development/theDreamBox/bin/App_Web_oq2tdtg4.DLL。 日志:尝试下载新的URL文件:/// C:/Users/stassis/Documents/Development/theDreamBox/bin/App_Web_oq2tdtg4/App_Web_oq2tdtg4.DLL。 日志:尝试下载新的URL文件:/// C:/ Users / stassis / AppData / Local / Temp / Temporary ASP.NET Files / root / 87ef3319 / ec80b2f5 / App_Web_oq2tdtg4.EXE。 日志:尝试下载新的URL文件:/// C:/ Users / stassis / AppData / Local / Temp / Temporary ASP.NET Files / root / 87ef3319 / ec80b2f5 / App_Web_oq2tdtg4 / App_Web_oq2tdtg4.EXE。 日志:尝试下载新的URL文件:/// C:/Users/stassis/Documents/Development/theDreamBox/bin/App_Web_oq2tdtg4.EXE。 日志:尝试下载新的URL文件:/// C:/Users/stassis/Documents/Development/theDreamBox/bin/App_Web_oq2tdtg4/App_Web_oq2tdtg4.EXE。

3 个答案:

答案 0 :(得分:2)

我不太确定你将两个服务绑定到同一个地址,可能你已经为每个服务实现更改了端点地址

<services>
 <service behaviorConfiguration="ServiceBehavior" name="Service">
   <endpoint address="a" binding="webHttpBinding"
       contract="IService" behaviorConfiguration="EndpBehavior"/>
 </service>
 <service behaviorConfiguration="ServiceBehavior" name="ServiceNew">
   <endpoint address="b" binding="webHttpBinding"
       contract="IServiceNew" behaviorConfiguration="EndpBehavior"/>
 </service>

答案 1 :(得分:1)

有一个错误会导致您观察到类似的行为。我不知道这是否是确切的问题,但您可以查看this support page

答案 2 :(得分:1)

几天前我的服务遇到了同样的问题See here

问题是我无法在一个.config文件中实现服务实现。

当我托管服务时,我必须给ServiceHost一种类型的实现 - 但是由于在配置文件中定义了tow,它会不断抛出错误。

我的解决方案是从配置中添加一个服务,然后在C#中添加另一个服务(到另一个ServiceHost