Walkthrough - TFS 2010 + IIS 7.5

Jan 12, 2011 at 11:12 PM
Edited Jan 12, 2011 at 11:15 PM

Hi Everyone,

I've spent a decent chunk of time getting this to work for the following configuration:

  • Windows Server 2008 R2 (IIS 7.5)
  • TFS 2010
  • Installing SvnBridge in the TFS Website (running on 80/443 instead of the default 8080)

Issue 1 - 405: Method Not Allowed

Try removing the WebDAV Module by going to Server Manager -> Roles -> Web Server -> Remove Role Services. Worked for me.

Issue 2 - 500: Internal Server Error

My folder structure is:

  • TFS Website
    • tfs
    • svn
      • Collection1
        • bin
          • SvnBridgeServer.dll
        • web.config
      • Collection2
        • bin
          • SvnBridgeServer.dll
        • web.config
      • ...

I installed SvnBridge multiple times (once for each collection, each one has a different web.config). If you configure the 'svn' node there as an application, you'll get 500 errors (because TortoiseSvn and other clients will do a PROPFIND on /svn, and there's no handler to respond). Instead, make sure you configure /svn as a virtual directory. Make Collection1, Collection2 etc an application, and make sure they run under the ASP.NET v.4.0 application pool (NOT the classic one!).

Issue 3: 404 Errors

Make sure that in your web.config for SvnBridge that you include the collection name in the URL. I'm sure in the future, we may see a modified version of SvnBridge that can present all collections to the user, but for now it's one collection per SvnBridge instance. For example:

  • <add key="TfsUrl" value="http://localhost:<TFSPortNumberHere>/tfs/Collection1" />

Summary

It really does work - I've tried to configure this many many times to no avail, but it looks like SvnBridge can be made to work with IIS 7.5 + TFS 2010.

Cheers,

Joe Fitzgerald

http://www.joefitzgerald.org

Jan 18, 2011 at 4:43 AM

THANK YOU for this post - your solution to the 405: Method not allowed got me going with IIS7.5 on Win7.

I didn't have to muck around with 'Roles' though, in IIS Manager I just removed 'WEBDAV' in the Default Web Site --> Modules list.

I'm using TFS2008 so didn't have to worry about Collecitons.

Craig (@conceptdev | conceptdev.blogspot.com)

Mar 23, 2011 at 2:33 PM

Joe - Thank you.  You saved me a bunch of time!  Much obliged sir.

May 15, 2011 at 3:53 AM

Works great thanks.

Oct 13, 2011 at 3:00 PM

I'm still getting a PROPFIND 405 issue with Tortise SVN browser on 2008 R2 with 2010 TFS. I have the directory structure setup as /svn is a vdir. WEBDAV module isn't listed, but of ton of others are (perhaps the problem is something else?) I can view the files in a web browser.

I'm not sure how the propfind handler can be tied to a virtual directory. I think I'm missing something. Could someone perhaps post screen shots or a listing of the modules for the /svn vdir?

Nov 2, 2011 at 7:18 PM

Great Work on the Internal 500 error.  Works like a charm now.

Jan 13, 2012 at 4:21 PM

Spent an hour looking at this, so I just might be stupid, but what correlation (if any) should be made with the name of the Collection folder(s) underneath the SVN folder to your collection name(s) in TFS 2010?  The reason is ask is because we currently have an exact same URL in play for folks who wish to connect VS 2008 to TFS2010.  So for example if I used http://tfs7:8080/tfs to connect via VS 2010, I have to use http://tfs7:8080/tfs/Collection1 to connect via VS2008, where tfs7 is the name of the TFS server, tfs is the name of the tfs web site, and Collection1 is the name of the default collection.  So, if I made Collection1 a virtual folder under the tfs web site, I would break the connection to VS 2008 users, no?

Feb 13, 2012 at 1:18 PM

Thanks for the tip on the 405 :) worked like a charm once webdav was removed :)

Feb 15, 2012 at 11:24 PM

Yay, I finally got my SVNBridge working.  These were my issues.  I am using Win Server 2008 R2 IIS 7.5

1)  I did not have Digest Authentication installed.  This was then installed. Server Manager --> Role Services --> Add Role Services

2)  The Application pool (svnbridgewas set to run under classic)  I changed this to Integrated.  >NET framework = 4.0 Identity = tfsservi.  And account that has admin rights for TFS.

Works like magic! Yay!

Feb 23, 2012 at 2:35 PM

For some reason it seems IIS Media Services 4.1 + SVN bridge doesn't work properly. I had to unload the LiveStreamingHandler module, otherwise it would error on for instance 'svn import'.

Anyone else experiencing that?

Mar 27, 2012 at 12:26 PM
Edited Mar 27, 2012 at 12:43 PM

Still get the error 404!

I have follow this instruction:

Issue 3: 404 Errors

Make sure that in your web.config for SvnBridge that you include the collection name in the URL. I'm sure in the future, we may see a modified version of SvnBridge that can present all collections to the user, but for now it's one collection per SvnBridge instance. For example:

  • <add key="TfsUrl" value="http://localhost:<TFSPortNumberHere>/tfs/Collection1" />

I get the following error: HTTP Error 404.4 and Most likely causes: The file extension for the requested URL does not have a handler configured to process the request on the Web server.

Can you help me?

 

Apr 11, 2012 at 1:55 PM

I have SvnBridge configured and working except for the Lock command which I am receiving a 405 error on. I can add source code, view history, checkout, etc through Tortoise and NetBeans but for the Lock command it consistently fails. I don’t have a WEBDAV Role within the TFS Server are there any other suggestions to get this to work?

Aug 28, 2013 at 12:03 AM
jlis235 wrote:
I have SvnBridge configured and working except for the Lock command which I am receiving a 405 error on. I can add source code, view history, checkout, etc through Tortoise and NetBeans but for the Lock command it consistently fails. I don’t have a WEBDAV Role within the TFS Server are there any other suggestions to get this to work?
I think you may have the same issue as I was having. look at the u_extend1.log file and look for a "<DTS> HEAD <path>" entry... if your svn client is sending HEAD requests then you need my special modification to fix it.. check the current work item https://svnbridge.codeplex.com/workitem/15338

IIs7.5, TFS2010, Basic authentic, Identity Impersionation, TortoiseSVN 1.8.1, QNX 6.3.0 SVN all ok :)
Sep 23, 2013 at 5:46 AM
lock and unlock commands are not currently supported.

https://svnbridge.codeplex.com/workitem/15339

upvote :)
Nov 13, 2013 at 9:00 PM
I have been trying to get svnbridge to work for several hours. As of now I have anonymous authentication as the only thing enabled with my user account hard coded to it. Whenever I access the svnbridge URL in my web browser, I get this page:

Revision 1: /

CodePlex powered by SvnBridge


There is more than 1 revision to my collection and there doesn't appear to be anything there.
Jan 16, 2014 at 8:45 AM
where we deploy SVN Bridge on TFS server or SVN server?
Jan 16, 2014 at 8:50 AM
I have deployed it on svn server and when i check out this error is occuring

Command: Checkout from http://localhost:8081/SvnBridge, revision HEAD, Fully recursive, Externals included
Error: Unable to connect to a repository at URL 'http://localhost:8081/SvnBridge'
Error: OPTIONS of 'http://localhost:8081/SvnBridge': could not connect to server
Error: (http://localhost:8081)
Completed!:
Jan 16, 2014 at 8:51 AM
clients says this error

<log level="Error">
<message><![CDATA[Error on handling request. Error id: 4aca83b3-2e23-41f6-91b8-0da98e749bd8
System.Net.WebException: The remote name could not be resolved: 'svnbridge'
at System.Net.HttpWebRequest.GetRequestStream(TransportContext& context)
at System.Net.HttpWebRequest.GetRequestStream()
at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
at CodePlex.TfsLibrary.RegistrationWebSvc.Registration.GetRegistrationEntries(String toolId)
at CodePlex.TfsLibrary.ObjectModel.RegistrationService.GetServiceInterfaceUrl(String tfsUrl, ICredentials credentials, String serviceType, String interfaceName)
at CodePlex.TfsLibrary.RepositoryWebSvc.RepositoryWebSvcFactory.Create(String tfsUrl, ICredentials credentials)
at CodePlex.TfsLibrary.ObjectModel.SourceControlService.<>c__DisplayClassd.<GetLatestChangeset>b__c()
at CodePlex.TfsLibrary.ObjectModel.SourceControlService.WrapWebException[T](WrapWebExceptionDelegate1 function)
at CodePlex.TfsLibrary.ObjectModel.SourceControlService.GetLatestChangeset(String tfsUrl, ICredentials credentials)
at SvnBridge.SourceControl.TFSSourceControlProvider.GetLatestVersion()
at SvnBridge.SourceControl.TFSSourceControlProvider.GetItems(Int32 version, String path, Recursion recursion, Boolean returnPropertyFiles)
at SvnBridge.SourceControl.TFSSourceControlProvider.ItemExists(String path, Int32 version)
at SvnBridge.SourceControl.TFSSourceControlProvider.ItemExists(String path)
at SvnBridge.Proxies.RemotingInvocation.Proceed()
at SvnBridge.Proxies.TracingInterceptor.Invoke(IInvocation invocation)
at SvnBridge.Proxies.RemotingInvocation.Proceed()
at SvnBridge.Proxies.RetryOnExceptionsInterceptor
1.Invoke(IInvocation invocation)
at SvnBridge.Proxies.RemotingInvocation.Proceed()
at SvnBridge.Proxies.ProxyFactory.RemotingProxy.Invoke(IMessage msg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at SvnBridge.SourceControl.TFSSourceControlProvider.ItemExists(String path)
at SvnBridge.Handlers.OptionsHandler.Handle(IHttpContext context, TFSSourceControlProvider sourceControlProvider)
at SvnBridge.Handlers.RequestHandlerBase.Handle(IHttpContext context, IPathParser pathParser, NetworkCredential credentials)
at SvnBridge.Net.HttpContextDispatcher.Dispatch(IHttpContext connection)
at SvnBridge.Net.Listener.Process(TcpClient tcpClient)]]></message>
<exception><![CDATA[System.Net.WebException: The remote name could not be resolved: 'svnbridge'
at System.Net.HttpWebRequest.GetRequestStream(TransportContext& context)
at System.Net.HttpWebRequest.GetRequestStream()
at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
at CodePlex.TfsLibrary.RegistrationWebSvc.Registration.GetRegistrationEntries(String toolId)
at CodePlex.TfsLibrary.ObjectModel.RegistrationService.GetServiceInterfaceUrl(String tfsUrl, ICredentials credentials, String serviceType, String interfaceName)
at CodePlex.TfsLibrary.RepositoryWebSvc.RepositoryWebSvcFactory.Create(String tfsUrl, ICredentials credentials)
at CodePlex.TfsLibrary.ObjectModel.SourceControlService.<>c__DisplayClassd.<GetLatestChangeset>b__c()
at CodePlex.TfsLibrary.ObjectModel.SourceControlService.WrapWebException[T](WrapWebExceptionDelegate1 function)
at CodePlex.TfsLibrary.ObjectModel.SourceControlService.GetLatestChangeset(String tfsUrl, ICredentials credentials)
at SvnBridge.SourceControl.TFSSourceControlProvider.GetLatestVersion()
at SvnBridge.SourceControl.TFSSourceControlProvider.GetItems(Int32 version, String path, Recursion recursion, Boolean returnPropertyFiles)
at SvnBridge.SourceControl.TFSSourceControlProvider.ItemExists(String path, Int32 version)
at SvnBridge.SourceControl.TFSSourceControlProvider.ItemExists(String path)
at SvnBridge.Proxies.RemotingInvocation.Proceed()
at SvnBridge.Proxies.TracingInterceptor.Invoke(IInvocation invocation)
at SvnBridge.Proxies.RemotingInvocation.Proceed()
at SvnBridge.Proxies.RetryOnExceptionsInterceptor
1.Invoke(IInvocation invocation)
at SvnBridge.Proxies.RemotingInvocation.Proceed()
at SvnBridge.Proxies.ProxyFactory.RemotingProxy.Invoke(IMessage msg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at SvnBridge.SourceControl.TFSSourceControlProvider.ItemExists(String path)
at SvnBridge.Handlers.OptionsHandler.Handle(IHttpContext context, TFSSourceControlProvider sourceControlProvider)
at SvnBridge.Handlers.RequestHandlerBase.Handle(IHttpContext context, IPathParser pathParser, NetworkCredential credentials)
at SvnBridge.Net.HttpContextDispatcher.Dispatch(IHttpContext connection)
at SvnBridge.Net.Listener.Process(TcpClient tcpClient)]]></exception>
</log><log level="Error">
<message><![CDATA[Error on handling request. Error id: e6ed50c6-af86-4d87-9165-01e8b3f010a1
System.Net.WebException: The remote name could not be resolved: 'svnbridge'
at System.Net.HttpWebRequest.GetRequestStream(TransportContext& context)
at System.Net.HttpWebRequest.GetRequestStream()
at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
at CodePlex.TfsLibrary.RegistrationWebSvc.Registration.GetRegistrationEntries(String toolId)
at CodePlex.TfsLibrary.ObjectModel.RegistrationService.GetServiceInterfaceUrl(String tfsUrl, ICredentials credentials, String serviceType, String interfaceName)
at CodePlex.TfsLibrary.RepositoryWebSvc.RepositoryWebSvcFactory.Create(String tfsUrl, ICredentials credentials)
at CodePlex.TfsLibrary.ObjectModel.SourceControlService.<>c__DisplayClassd.<GetLatestChangeset>b__c()
at CodePlex.TfsLibrary.ObjectModel.SourceControlService.WrapWebException[T](WrapWebExceptionDelegate1 function)
at CodePlex.TfsLibrary.ObjectModel.SourceControlService.GetLatestChangeset(String tfsUrl, ICredentials credentials)
at SvnBridge.SourceControl.TFSSourceControlProvider.GetLatestVersion()
at SvnBridge.SourceControl.TFSSourceControlProvider.GetItems(Int32 version, String path, Recursion recursion, Boolean returnPropertyFiles)
at SvnBridge.SourceControl.TFSSourceControlProvider.ItemExists(String path, Int32 version)
at SvnBridge.SourceControl.TFSSourceControlProvider.ItemExists(String path)
at SvnBridge.Proxies.RemotingInvocation.Proceed()
at SvnBridge.Proxies.TracingInterceptor.Invoke(IInvocation invocation)
at SvnBridge.Proxies.RemotingInvocation.Proceed()
at SvnBridge.Proxies.RetryOnExceptionsInterceptor
1.Invoke(IInvocation invocation)
at SvnBridge.Proxies.RemotingInvocation.Proceed()
at SvnBridge.Proxies.ProxyFactory.RemotingProxy.Invoke(IMessage msg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at SvnBridge.SourceControl.TFSSourceControlProvider.ItemExists(String path)
at SvnBridge.Handlers.OptionsHandler.Handle(IHttpContext context, TFSSourceControlProvider sourceControlProvider)
at SvnBridge.Handlers.RequestHandlerBase.Handle(IHttpContext context, IPathParser pathParser, NetworkCredential credentials)
at SvnBridge.Net.HttpContextDispatcher.Dispatch(IHttpContext connection)
at SvnBridge.Net.Listener.Process(TcpClient tcpClient)]]></message>
<exception><![CDATA[System.Net.WebException: The remote name could not be resolved: 'svnbridge'
at System.Net.HttpWebRequest.GetRequestStream(TransportContext& context)
at System.Net.HttpWebRequest.GetRequestStream()
at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
at CodePlex.TfsLibrary.RegistrationWebSvc.Registration.GetRegistrationEntries(String toolId)
at CodePlex.TfsLibrary.ObjectModel.RegistrationService.GetServiceInterfaceUrl(String tfsUrl, ICredentials credentials, String serviceType, String interfaceName)
at CodePlex.TfsLibrary.RepositoryWebSvc.RepositoryWebSvcFactory.Create(String tfsUrl, ICredentials credentials)
at CodePlex.TfsLibrary.ObjectModel.SourceControlService.<>c__DisplayClassd.<GetLatestChangeset>b__c()
at CodePlex.TfsLibrary.ObjectModel.SourceControlService.WrapWebException[T](WrapWebExceptionDelegate`1 function)
at CodePlex.TfsLibrary.ObjectModel.SourceControlService.GetLatestChangeset(String tfsUrl, ICredentials credentials)
at SvnBridge.SourceControl.TFSSourceControlProvider.GetLatestVersion()
at SvnBridge.SourceControl.TFSSourceControlProvider.GetItems(Int32 version, String path, Recursion recursion, Boolean returnPropertyFiles)
at SvnBridge.SourceControl.TFSSourceControlProvider.ItemExists(String path, Int32 version)
at SvnBridge.SourceControl.TFSSourceControlProvider.ItemExists(String path)
at SvnBridge.Proxies.RemotingInvocation.Proceed()
at SvnBridge.Proxies.TracingInterceptor.Invoke(IInvocation invocation)
at SvnBridge.Proxies.RemotingInvocation.Proceed()
Jan 16, 2014 at 7:11 PM
@salman35:

If you decide to deploy the current sorry state of SvnBridge, then I'd strongly recommend having SvnBridge installed on a TFS server machine rather than an SVN server machine (why would that machine even be related?). Reason being that on the SVN client <-> SvnBridge side the number of SVN protocol web service requests is very small, while on the SvnBridge <-> TFS side this SVN protocol translation effort often translates into up to many thousands of TFS web service requests (e.g. "show me revision states of a whole tree of files, given a single root dir specification"), which are a huge penalty yet which is tolerable in case of inner-machine processing, since external network per-request latency will be nonexistent then.

As to your connection problem, I'm currently a bit uncertain, but I assume that your URL format is wrong, possibly missing another port number part.