简体   繁体   中英

SwaggerWCF configuration for self hosted WCF library

I'm having some difficulties getting SwaggerWCF to load my documentation page, and I'm not sure why. I get no errors, but I also get no Swagger docs either, just a 404 when I visit http://localhost:8733/docs per the endpoint configuration. What am I doing wrong here? I have everything decorated up, using Framework 4.8. Service works fine and the mex and js endpoints will return data, just no swaggerUI.

Here is my App.Config:

<system.serviceModel>
        <standardEndpoints>
            <webHttpEndpoint>
                <standardEndpoint name="" contentTypeMapper="Microsoft.Samples.WebContentTypeMapper.JsonContentTypeMapper, JsonContentTypeMapper, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
            </webHttpEndpoint>
        </standardEndpoints>
        <services>
            <service name="AutodeskVaultAPI.VaultWorker">
                <endpoint address="" binding="basicHttpBinding" contract="AutodeskVaultAPI.IVaultServices">
                    <identity>
                        <dns value="localhost" />
                    </identity>
                </endpoint>
                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
                <endpoint address="js" behaviorConfiguration="jsonEP" binding="webHttpBinding"
                 name="jsonEP" contract="AutodeskVaultAPI.IVaultServices" />
                <host>
                    <baseAddresses>
                        <add baseAddress="http://localhost:8733/AutodeskVaultAPI/" />
                    </baseAddresses>
                </host>
            </service>
            <service name="SwaggerWcf.SwaggerWcfEndpoint">
                <endpoint address="http://localhost:8733/docs" binding="webHttpBinding" contract="SwaggerWcf.ISwaggerWcfEndpoint" />
            </service>
        </services>
        <behaviors>
            <serviceBehaviors>
                <behavior>
                    <serviceMetadata httpGetEnabled="True" httpsGetEnabled="True" />
                    <serviceDebug includeExceptionDetailInFaults="True" />
                </behavior>
            </serviceBehaviors>
            <endpointBehaviors>
                <behavior name="jsonEP">
                    <webHttp helpEnabled="true" automaticFormatSelectionEnabled="true"/>
                </behavior>
            </endpointBehaviors>
        </behaviors>
    </system.serviceModel>

Here is my service implementation:

    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    [SwaggerWcf("/AutodeskVaultAPI/js")]
    public class VaultWorker : IVaultServices
    {
       ...[redacted]...

        [SwaggerWcfTag("AutodeskVaultAPI")]
        public AutodeskVaultFolder GetRootFolder(string vaultServerName = "", string currentUserLogin = "false")
        {
            try
            {
                Folder rootFolder = VaultConnection.WebServiceManager.DocumentService.GetFolderRoot();
                if (null == rootFolder)
                    return null;
                else
                {
                    var toReturn = new AutodeskVaultFolder()
                    {
                        Created = rootFolder.CreateDate,
                        Category = (null == rootFolder.Cat) ? "No Category" : rootFolder.Cat.CatName,
                        CreatedByUserID = rootFolder.CreateUserId,
                        CreatedByUserName = rootFolder.CreateUserName,
                        EntityMasterID = rootFolder.Id,
                        FolderEntityName = rootFolder.Name,
                        FolderFullPath = rootFolder.FullName,
                        IsVaultRoot = true,
                        NumberOfChildren = rootFolder.NumClds,
                        ParentID = rootFolder.ParId
                    };
                    return toReturn;
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex);
                return null;
            }
        }

        [SwaggerWcfTag("AutodeskVaultAPI")]
        public AutodeskVaultSearchResponse SearchVault(AutodeskVaultSearchRequest request)
        {
            try
            {
                string bookMark = string.Empty;
                var parameters = getSearchParametersFromRequest(request);
                SrchStatus srchStatus = null;
                List<File> foundFiles = new List<File>();
                if (null != parameters && parameters.Length > 0)
                {
                    while (null == srchStatus || foundFiles.Count < srchStatus.TotalHits)
                    {
                        File[] srcResults = VaultConnection.WebServiceManager.DocumentService.FindFilesBySearchConditions(parameters, null, null, true, false, ref bookMark, out srchStatus);
                        if (null != srcResults)
                            foundFiles.AddRange(srcResults);
                        else
                            break;
                    }
                }
                return mapResultsToResponse(request, foundFiles);
            }
            catch (Exception ex)
            {
                Debug.Write(ex);
                return null;
            }
        }

       ...[redacted]...


    [DataContract(Name = "AutodeskVaultSearchRequest")]
    public class AutodeskVaultSearchRequest
    {
        [DataMember]
        public bool OR_Search = false;
        [DataMember]
        public List<AutodeskVaultProperty> properties;
    }

    [DataContract(Name = "AutodeskVaultSearchResponse")]
    public class AutodeskVaultSearchResponse
    {
        [DataMember]
        public AutodeskVaultSearchRequest Request;
        [DataMember]
        public List<AutodeskVaultFile> Files;
        [DataMember]
        public string Message;

and here is my service interface:

    [ServiceContract]
    public interface IVaultServices
    {
        [SwaggerWcfPath("GetRootFolder", @"Test the default configured server to see if we can get back the root folder")]
        [OperationContract]
        [WebInvoke(UriTemplate = "GetRootfolder/{vaultServerName}/{currentUserLogin}", Method = "GET", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        [Description(@"Test the default configured server to see if we can get back the root folder")]
        AutodeskVaultFolder GetRootFolder(string vaultServerName = "", string currentUserLogin = "false");

        [SwaggerWcfPath("GetAsbuiltDrawingsByNumber", @"Given an Autodesk Search Request, search through Vault to find File information using the supplied properties.")]
        [OperationContract]
        [WebInvoke(UriTemplate = "SearchVault", Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        [Description(@"Given an Autodesk Search Request, search through Vault to find File information using the supplied properties.")]
        AutodeskVaultSearchResponse SearchVault(AutodeskVaultSearchRequest request);
    }

You need to check the code written in Global.asax .

protected void Application_Start(object sender, EventArgs e)
{
         // [.......]    
         RouteTable.Routes.Add(new ServiceRoute("api-docs", new WebServiceHostFactory(), typeof(SwaggerWcfEndpoint)));
}

Edit Web.config and add the following in the system.serviceModel block.

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>

Edit Web.config again and add the following in the system.webServer block.

<modules runAllManagedModulesForAllRequests="true"/>

You can refer to the steps provided in the link for details.
https://github.com/abelsilva/swaggerwcf
How do I view my Swagger docs when using SwaggerWcf?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM