简体   繁体   English

自托管 WCF 库的 SwaggerWCF 配置

[英]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.我在让 SwaggerWCF 加载我的文档页面时遇到了一些困难,我不知道为什么。 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.我没有收到任何错误,但我也没有收到 Swagger 文档,当我根据端点配置访问 http://localhost:8733/docs 时只有 404。 What am I doing wrong here?我在这里做错了什么? I have everything decorated up, using Framework 4.8.我使用 Framework 4.8 装饰了所有东西。 Service works fine and the mex and js endpoints will return data, just no swaggerUI.服务工作正常,mex 和 js 端点将返回数据,只是没有 swaggerUI。

Here is my App.Config:这是我的 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 .您需要检查用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.编辑Web.config并在system.serviceModel块中添加以下内容。

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

Edit Web.config again and add the following in the system.webServer block.再次编辑Web.config并在system.webServer块中添加以下内容。

<modules runAllManagedModulesForAllRequests="true"/>

You can refer to the steps provided in the link for details.您可以参考链接中提供的步骤了解详细信息。
https://github.com/abelsilva/swaggerwcf https://github.com/abelsilva/swaggerwcf
How do I view my Swagger docs when using SwaggerWcf? 使用 SwaggerWcf 时如何查看我的 Swagger 文档?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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