【问题标题】:WCF - have more than one .svc service in an ASP.NET applicationWCF - 在 ASP.NET 应用程序中有多个 .svc 服务
【发布时间】:2013-01-27 18:46:11
【问题描述】:

我在 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,当我像以前一样使用 jQuery 帖子点击它们时,第一个 Service.svc 会起作用,并且然后,如果我只是将这些文件再次复制回我的文件夹并运行 Visual Studio 主机,那么我的两个服务(旧的和新的)都会随机工作一段时间,然后当我用 jQuery 击中它们时它们再次突然返回 500 错误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 会显示以下异常:

无法加载文件或程序集“App_Web_oq2tdtg4, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null”或其依赖项之一。系统找不到指定的文件。

堆栈跟踪:

[FileNotFoundException:无法加载文件或程序集“App_Web_oq2tdtg4,版本=0.0.0.0,文化=中性,PublicKeyToken=null”或其依赖项之一。该系统找不到指定的文件。] System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +0 System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +39 System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef,证据 assemblySecurity,StackCrawlMark 和 stackMark,Boolean for Introspection,Boolean suppressSecurityChecks)+132 System.Reflection.RuntimeAssembly.InternalLoad(字符串 assemblyString,证据 assemblySecurity,StackCrawlMark 和 stackMark,Boolean for Introspection)+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:服务'/ServiceNew.svc'由于编译过程中的异常而无法激活。异常消息是:无法加载文件或程序集 'App_Web_oq2tdtg4,Version=0.0.0.0,Culture=neutral,PublicKeyToken=null' 或其依赖项之一。该系统找不到指定的文件..] System.Runtime.AsyncResult.End(IAsyncResult 结果) +687598 System.ServiceModel.Activation.HostedHttpRequestAsyncResult.End(IAsyncResult 结果) +190 System.ServiceModel.Activation.HostedHttpRequestAsyncResult.ExecuteSynchronous(HttpApplication 上下文,字符串 routeServiceVirtualPath,布尔流上下文,布尔确保WFService)+234 System.ServiceModel.Activation.HttpHandler.ProcessRequest(HttpContext 上下文)+24 System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +100 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75

装配负载跟踪:

以下信息有助于确定为什么无法加载程序集“App_Web_oq2tdtg4, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null”。

=== 预绑定状态信息 === 日志:用户 = ZULUTRADE\stassis 日志:DisplayName = App_Web_oq2tdtg4,版本=0.0.0.0,文化=中性,PublicKeyToken=null (完全指定) 日志:Appbase = file:///C:/Users/stassis/Documents/Development/theDreamBox/ LOG:初始 PrivatePath = C:\Users\stassis\Documents\Development\theDreamBox\bin

调用程序集:(未知)。

LOG:此绑定在默认加载上下文中开始。 LOG:使用应用程序配置文件:C:\Users\stassis\Documents\Development\theDreamBox\web.config LOG:使用主机配置文件: LOG:使用 C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config 中的机器配置文件。 LOG:此时未将策略应用于引用(私有、自定义、部分或基于位置的程序集绑定)。 日志:正在尝试下载新的 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。

【问题讨论】:

  • 当您尝试使用网络浏览器调用 wsdl 文件时,您能否检查它们是否正确发布?
  • 你是在你的开发机器上运行它吗?事件日志是否为您提供更多信息?您从服务返回的数据集有多大?
  • 是的,我在我的开发机器上运行它。我会更新我的帖子并写下我认为你想要的日志。当我在调试模式下运行我的 ServiceNew.svc 文件时,在异常中以及在浏览器中显示的内容中提到了此日志
  • 抱歉,我无法发现错误,所以我会继续提问:您使用哪些设置用于指定引用的程序集中的重用类型? msdn.microsoft.com/en-us/library/bb628653(v=vs.100).aspx

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


【解决方案1】:

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

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

【讨论】:

  • 我已经尝试过你刚才所说的地址,但它再次抛出相同的错误,并且在调试 (F5) 中运行 ServiceNew.svc 时抛出相同的异常
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    问题是我不能在一个 .config 文件中提供服务实现。

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

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

    【讨论】:

      猜你喜欢
      • 2010-10-30
      • 2020-03-07
      • 2013-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多