天道酬勤,学无止境

如何在 Web API 中实现 HttpMessageHandler?(How to implement HttpMessageHandler in Web API?)

问题

在 ASP.NET 4.5 MVC 4 Web API 项目中,我想添加一个自定义HttpMessageHandler 。 我已经更改了WebApiConfig类(在 \App_Satrt\WebApiConfig.cs 中),如下所示:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional },
            constraints: null,
            handler: new MyCustomizedHttpMessageHandler()
        );
    }
}

然后我开发了MyCustomizedHttpMessageHandler

public class MyCustomizedHttpMessageHandler : HttpMessageHandler
{
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        IPrincipal principal = new GenericPrincipal(
            new GenericIdentity("myuser"), new string[] { "myrole" });
        Thread.CurrentPrincipal = principal;
        HttpContext.Current.User = principal;

        return Task<HttpResponseMessage>.Factory.StartNew(() => request.CreateResponse());
    }
}

但是,对 API 的请求(比方说 http://mylocalhost.com/api/values)总是返回状态代码 200,没有任何数据。 我的意思是它永远不会到达 ValuesController.cs 的 'GET()' 方法。

我错过了什么? 如何正确实现HttpMessageHandler

PS:已经读过这个:https://stackoverflow.com/a/12030785/538387,对我没有帮助。

回答1

在这里,您正在创建一个HttpMessageHandler ,它使请求短路,并且不让请求通过管道的其余部分。 相反,您应该创建一个DelegatingHandler

Web API 中还有 2 种消息处理程序管道。 一种是常规管道,其中所有路由的所有请求都通过,另一种可能只有特定于某些路由的消息处理程序。

  1. 尝试创建一个DelegatingHandler并将其添加到您的HttpConfiguration的消息处理程序列表中:

     config.MessageHandlers.Add(new HandlerA())
  2. 如果要添加特定于路由的消息处理程序,则可以执行以下操作:

     config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional }, constraints: null, handler: HttpClientFactory.CreatePipeline( new HttpControllerDispatcher(config), new DelegatingHandler[]{new HandlerA()}) );

此 Web Api 海报展示了管道流程。

回答2

要编写自定义消息处理程序,您应该从System.Net.Http.DelegatingHandler派生

class CustomMessageHandler : DelegatingHandler
{
    protected override Task<HttpResponseMessage> 
      SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        IPrincipal principal = new GenericPrincipal(
            new GenericIdentity("myuser"), new string[] { "myrole" });
        Thread.CurrentPrincipal = principal;
        HttpContext.Current.User = principal;

        return base.SendAsync(request, cancellationToken);
    }
}

并调用base.SendAsync将请求发送到内部处理程序。

回答3

我使用@cuongle 答案来解决我的问题。 只需添加一项。 所以我没有得到“内部处理程序尚未分配。 ”。 谢谢@coungle。

public class CustomMessageHandler : DelegatingHandler
{
        public CustomMessageHandler ()
        {
              //add this to solve "The inner handler has not been assigned"
               InnerHandler = new HttpClientHandler();
        }
    
        protected override async Task<HttpResponseMessage> 
          SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            // Before request 
            IPrincipal principal = new GenericPrincipal(
                new GenericIdentity("myuser"), new string[] { "myrole" });
            Thread.CurrentPrincipal = principal;
            HttpContext.Current.User = principal;
    
            var result = await base.SendAsync(request, cancellationToken);
    
            // After request when response arrives
            
            return result;
        }
}

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • How to implement HttpMessageHandler in Web API?
    In an ASP.NET 4.5 MVC 4 Web API project, I want to add a custom HttpMessageHandler. I've changed WebApiConfig class (in \App_Satrt\WebApiConfig.cs), as follows: public static class WebApiConfig { public static void Register(HttpConfiguration config) { config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional }, constraints: null, handler: new MyCustomizedHttpMessageHandler() ); } } Then I developed MyCustomizedHttpMessageHandler: public class MyCustomizedHttpMessageHandler : HttpMessageHandler { protected override Task
  • 我如何访问在单独的 Web 应用程序中实现远程接口的 EJB?(How do i access EJB implementing remote interface in separate web application?)
    问题 我使用的是 Netbeans 6.8 和 Glassfish v3.0。 我创建了一个 ejb 模块并从数据库创建了实体类,然后创建了具有远程接口的无状态会话 bean。 比如说。 @Remote public interface customerRemote{ public void add(String name, String address); public Customer find(Integer id); } @Stateless public class customerBean implements customerRemote{ //implementations of methods } 然后我创建了一个新的 Web 应用程序。 但是现在我如何在我的 Web 应用程序中访问远程 ejb。 我可以用 jndi 名称查找 bean,但我想知道的是,它将返回什么类型的对象? 我如何在 customerRemote 中对其进行类型转换? 我的 Web 应用程序中没有任何名为 customerRemote 的类。 那么,我该怎么做? 另外,实体类 Customer 呢? 在我的 Web 应用程序中也没有这样的名为 Customer 的类。 所有 ejb 和实体类都在单独的 ejb 模块中。 请帮我 :( 回答1 我如何在 customerRemote
  • 你如何在 Flask 中实现令牌认证?(How do you implement token authentication in Flask?)
    问题 我正在尝试允许用户使用他们的帐户从单独的 Web 服务登录到我的 Flask 应用程序。 我可以联系此 Web 服务的 api 并接收安全令牌。 如何使用此令牌对用户进行身份验证,以便他们可以访问受限视图? 我不需要将用户保存到我自己的数据库中。 我只想验证他们的会话。 我相信这可以使用 Flask-Security 和 @auth_token_required 装饰器来完成,但文档不是很详细,我不确定如何实现。 编辑: 这是一个代码示例: @main.route("/login", methods=["GET", "POST"]) def login(): payload = {"User": "john", "Password": "password123"} url = "http://webserviceexample/api/login" headers = {'content-type': 'application/json'}) #login to web service r = requests.post(url, headers=headers, json=payload) response = r.json() if (r.status_code is 200): token = response['user']['authentication_token
  • 如何在ASP.NET MVC 5和WEB API 2中实现oauth2服务器(How to implement oauth2 server in ASP.NET MVC 5 and WEB API 2 [closed])
    问题 关闭。 此问题不符合堆栈溢出准则。 它当前不接受答案。 想要改善这个问题吗? 更新问题,使它成为Stack Overflow的主题。 1年前关闭。 改善这个问题 首先,我将草绘我的项目: 对于我的实习,我需要向现有系统中添加功能。 用户通过OAuth2授权后,第三方客户端必须能够从AX Web服务访问数据。 我知道我需要制作一个“代理Web服务”,客户端可以在其中进行调用,并且可以调用AX服务,但是我对OAuth2部分还是不太确定。 大多数教程和指南都是关于将ASP.NET的Identity用于Facebook或Google登录。 我不需要,我需要使用现有的凭据,所以我需要制作自己的OAuth2服务。 我发现很难找到有关此的教程,指南或解释。 我了解OAuth2以及需要执行的操作,但是我之前从未做过这样的事情,因此很难启动。 我找到的最接近我需要的东西是这个github repo链接,但是解决方案未构建。 我想到的是建立一个ASP.NET MVC网站,客户(第三方)可以在该网站上注册自己并获取其客户ID。 使用ASP.NET API,我想创建使用必需的标记和参数的API,然后访问Dyn AX服务。 这是正确的还是我完全错了? 任何有关构建自己的oauth2服务器/服务的帮助或链接都将很不错。 回答1 Taiseer Joudeh有一篇精彩的博客文章,其中包含详细的分步说明。
  • 如何安全地在自定义WebAPI HttpMessageHandler中设置用户主体?(How can I safely set the user principal in a custom WebAPI HttpMessageHandler?)
    问题 对于基本身份验证,我已基于Darin Dimitrov的答案(此处为https://stackoverflow.com/a/11536349/270591)中显示的示例实现了自定义HttpMessageHandler 。 该代码创建具有用户名和角色的GenericPrincipal类型的实例principal ,然后将此主体设置为线程的当前主体: Thread.CurrentPrincipal = principal; 稍后,在ApiController方法中,可以通过访问控制器的User属性读取主体: public class ValuesController : ApiController { public void Post(TestModel model) { var user = User; // this should be the principal set in the handler //... } } 直到我最近添加了一个使用Task库的自定义MediaTypeFormatter ,如下所示,这似乎可以正常工作: public override Task<object> ReadFromStreamAsync(Type type, Stream readStream, HttpContent content, IFormatterLogger
  • 如何在 asp.net core web api(无第三方)中实现 JWT 刷新令牌?(How to implement JWT Refresh Tokens in asp.net core web api (no 3rd party)?)
    问题 我正在使用使用 JWT 的 asp.net 核心实现 web api。 我在尝试学习时没有使用第三方解决方案,例如 IdentityServer4。 我已经让 JWT 配置工作了,但是我对如何在 JWT 过期时实现刷新令牌感到困惑。 下面是我在 startup.cs 中的 Configure 方法中的一些示例代码。 app.UseJwtBearerAuthentication(new JwtBearerOptions() { AuthenticationScheme = "Jwt", AutomaticAuthenticate = true, AutomaticChallenge = true, TokenValidationParameters = new TokenValidationParameters() { ValidAudience = Configuration["Tokens:Audience"], ValidIssuer = Configuration["Tokens:Issuer"], ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Tokens:Key"]))
  • 如何在JSF框架中实现JAX-RS RESTful服务(How to implement JAX-RS RESTful service in JSF framework)
    问题 在我的实验室中,我被要求使用JSF框架创建一个简单的网站,并同时使用REST。 我对这两个做了一些研究。 事实证明,对于REST,我必须结合使用Jersey和JAX-RS框架。 我想知道如何集成这两个框架,即JAX-RS和JSF? 我已经在JSF的web.xml具有以下servlet: <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>/test/*</url-pattern> </servlet-mapping> 对于Jersey,我认为我必须在web.xml使用以下servlet: <servlet> <servlet-name>Jersey REST Service</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <init-param> <param-name>jersey.config
  • 如何在 ASP.NET Core 2.0 中实现 machineKey(How to implement machineKey in ASP.NET Core 2.0)
    问题 在 ASP.NET(非核心)中,我通常会向 web.config 添加 machineKey,以便我可以在本地计算机而不是服务器上执行某些功能,以便数据库/回调操作将使用相同的密钥。 例如 <system.web> <machineKey validationKey="*********" decryptionKey="*********" validation="HMACSHA256" decryption="AES" /> </system.web> 请有人建议如何在 ASP.NET Core 2.0 中做到这一点? 回答1 您现在需要使用 DataProtection API: ASP.NET Core 数据保护堆栈提供了一个简单易用的加密 API,开发人员可以使用它来保护数据,包括密钥管理和轮换。 可以在官方 DataProtection 存储库中找到示例。 顺便说一下,同样的方法适用于 ASP.NET:Replacecing <machineKey> in ASP.NET 数据保护系统建立在两个核心概念之上——数据保护提供程序(由IDataProtectionProvider接口表示),用于通过CreateProtector方法创建数据保护程序(由IDataProtector接口表示)。 数据保护器用于加密和解密数据。
  • 如何使用我现有的 Web 项目实现数字签名(How to implement digital signature with my existing web project)
    问题 我正在从事用户需要对文档进行数字签名的项目。 我在谷歌上查了一下,知道 sinadura 是一个桌面应用程序,但我需要在我的网络应用程序中调用它。 我在 Linux 服务器上安装了 alfresco 社区版 (https://www.alfresco.com/thank-you/thank-you-downloading-alfresco-community-edition) 并按照以下 GitHub 链接的说明进行操作。 https://github.com/zylklab/alfresco-sinadura 我已按照上述说明成功实施。 但是 Alfresco 是一个大项目,并且还提供了其他几个功能。 但我不需要那个,我只需要在我自己的类似于 alfresco 的 Web 应用程序中实现数字签名部分 如何在我现有的项目中实现数字签名部分? 任何人都可以请提出建议 回答1 浏览器的安全限制不允许 javascript 访问系统证书密钥库或智能卡。 以前可以使用 java 小程序,但随着最新的浏览器更新,它不再可能。 当前的浏览器数字签名解决方案需要在用户计算机上安装桌面软件。 操作过程如下: 安装:用户在他的电脑上安装桌面软件。 该软件安装自签名证书,并包含一个嵌入式浏览器,该浏览器侦听计算机端口并将其作为服务运行 Web 应用程序使用安全 Web 连接向本地软件请求签名。
  • 如何在Android中实现ListView缓存(How to implement ListView caching in Android)
    问题 我有一个包含大量数据的 ListView。 第一次,我从 Web 服务加载所有数据。 现在我想缓存这些数据,这样,如果我再次打开该页面,我可以从缓存中获取数据,而不是再次查询网络服务。 我怎么做?。 回答1 我假设您将从WebService检索到的数据存储在一个可序列化的对象中(正如您在编辑之前在问题中所述)。 您可以将可序列化对象存储到文件中并稍后加载它们: 店铺: FileOutputStream fileOutputStream = yourContext.openFileOutput(fileName, Context.MODE_PRIVATE); ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream); objectOutputStream.writeObject(yourObject); objectOutputStream.close(); 加载: FileInputStream fileInputStream = yourContext.openFileInput(fileName); ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream); Object
  • 如何在 Laravel 护照中实现多重身份验证(how to implement multiauth in laravel passport)
    问题 我有两个用户 admin/user 我想验证这两个用户的 api,它适用于一个用户,但它不适用于 admin 看看我在管理控制器中尝试了什么 public function login(Request $request){ // $res=; // dd ($res); if(Auth::guard('admin')->attempt(['email' => $request->email, 'password' => $request->password])) { // if successful, then redirect to their intended location $user = auth()->guard('admin')->user(); $success['token'] = $user->createToken('admin')->accessToken; return response()->json(['success' => $success], $this->successStatus); } else{ return response()->json(['error'=>'Unauthorised','email'=> $request->email,'password'=> $request->password], 401); } }
  • 如何在Flask中实现需要登录的装饰器(How to implement login required decorator in Flask)
    问题 我有2个可以一起使用的Flask应用程序(不同的项目)。 一个实现了一些使用令牌进行身份验证的API。 第二个使用API​​并为其创建Web界面。 现在,我有一个登录功能,可以将用户名和密码发送到API,如果正确,则返回auth令牌。 获得令牌后,将其保存到用户会话中,现在应将用户视为已登录/已认证。 在这种情况下,如何实现login_required装饰器。 这是我的登录功能- def login(self): response = make_request(BASE_URL + 'login/', clean_data(self.data)) if response.status_code == 200: session['auth_token'] = response.json().get('auth_token') return True return False 如何制作login_required装饰器? 如果有问题,我也正在使用Redis存储会话。 回答1 另外,请查看有关装饰器的官方Flask文档:https://flask.palletsprojects.com/en/1.1.x/patterns/viewdecorators/或python文档https://www.python.org/dev/peps / pep-0318 /。 您的装饰器应类似于:
  • 如何在 RESTful Web 服务中实现登录?(How do I implement login in a RESTful web service?)
    问题 我正在构建一个带有服务层的 Web 应用程序。 服务层将使用 RESTful 设计构建。 我们的想法是,在未来的某个时候,我们可能会构建其他应用程序(iPhone、Android 等),它们使用与 Web 应用程序相同的服务层。 我的问题是 - 如何实现登录? 我想我很难从更传统的基于动词的设计转向基于资源的设计。 如果我使用 SOAP 构建它,我可能会有一个名为 Login 的方法。 在 REST 中,我应该有一个资源。 我很难理解应该如何构建用于登录的 URI。 应该是这样的: http://myservice/{用户名}?p={密码} 编辑:前端 Web 应用程序使用传统的 ASP.NET 框架进行身份验证。 但是,在身份验证过程中的某个时刻,我需要验证提供的凭据。 在传统的 Web 应用程序中,我会进行数据库查找。 但在这种情况下,我正在调用服务而不是进行数据库查找。 所以我需要服务中的一些东西来验证提供的凭据。 除了验证所提供的凭据之外,我可能还需要在用户成功通过身份验证后获得有关用户的某种信息 - 例如他们的全名、他们的 ID 等。我希望这能让问题更清楚。 还是我没有以正确的方式思考这个问题? 我觉得我很难正确描述我的问题。 科里 回答1 正如 S.Lott 已经指出的那样,我们在这里有两个折叠的东西:登录和身份验证 身份验证在这里超出范围
  • 使用自定义表在 MVC 和 Web API 中实现基于角色的授权(Implementing role based authorization in MVC and Web API with custom table)
    问题 我继承了一个带有数据库的应用程序。 数据库有以下与认证和授权相关的表格。 用户表 用户名 密码 用户类型 ID 用户类型表 用户类型 ID 用户类型描述 用户类型表存储用户的角色,例如管理员、编辑等。 如果我想实现如下授权 [Authorize(Roles="Admin, Editor")] public IHttpActionResult GetOrders() { //Code here } 我应该在哪里编写代码,以便角色可用于授权属性? 编辑 我已经有一个数据库。 所以我不能使用 AspNetUserRoles 或 AspNetRoles 表。 我需要使用我的自定义表来设置角色。 编辑2 正如@Nkosi 所问,这里是如何实现身份验证的代码片段。 实际实现调用业务层服务并执行加密和其他操作,但我简化了代码片段 public HttpResponseMessage Authenticate(User user) { var isValid = myRepository.Exists(a => a.UserName == user.UserName && a.Password == user.Password); if(isValid) { FormsAuthentication.SetAuthCookie(user.UserName,false); } }
  • 在android中实现一对一和群聊[重复](Implementing one to one and group chat in android [duplicate])
    问题 这个问题在这里已经有了答案: 如何在android中制作聊天应用程序? [关闭] (6 个回答) 7年前关闭。 我正在开发一个 Android 应用程序,我必须在其中实现聊天消息。 我想要一对一聊天或群聊。 但我不知道如何开始。 请帮我解决这个问题。 任何帮助将不胜感激。 回答1 一个简单的聊天机制将具有 2 个基本功能 将消息发送到服务器(包含有关收件人的信息) 从服务器接收消息(指定为我的用户名) 第一步很简单,我们可以创建一个 Web 服务,该服务将接受带有有关收件人的附加信息的消息。 我们可以使用任何服务器端语言创建它。 第 2 步,即从服务器获取消息可以使用 2 种技术完成,从服务器拉取消息(使用轮询),或将消息从服​​务器推送到 android 手机 轮询:在这种情况下,Android 设备将在几秒钟后继续访问服务器以检查是否有可供用户使用的消息。 这也可以在客户端使用一个简单的异步任务来实现,该任务将在 2-3 秒后继续调用 Web 服务。 如果我们计划仅在用户访问应用程序时启用聊天(没有像 gmail 或 facebook 这样的通知),那么这很好用,这样我们就可以在不使用时终止轮询服务(否则它会消耗资源)。 推送通知:更好的选择是使用推送通知。 Android 提供 Google 云消息传递或 GCM (http://developer.android
  • 如何在 Spring Security 中实现基于 JWT 的身份验证和授权(How to implement JWT based authentication and authorization in Spring Security)
    问题 如何在 Spring Security 中实现基于 JWT 的身份验证和授权 我正在尝试在我的 Spring Boot 应用程序中实现基于 jwt 的身份验证和授权。 我按照这里写的教程进行操作。 但它在我的应用程序中没有做任何事情。 它不返回 jwt 令牌,而是我通过了身份验证并且我的请求得到了满足。 我是春季安全的新手。 这是我的代码。 我希望我的应用程序返回 jwt 令牌并使用令牌请求必须得到授权。 这是我的代码。 JWTAuthenticationFilter.java import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; public class JWTAuthenticationFilter extends UsernamePasswordAuthenticationFilter { private AuthenticationManager authenticationManager; @Autowired CustomUserDetailsService userService; public JWTAuthenticationFilter(AuthenticationManager
  • 如何在反应式、功能性(未注释)webflux 服务中实现@RequestPart?(How to implement @RequestPart in a reactive, functional (not annotated) webflux service?)
    问题 我有一个 Spring Boot 2,反应式 webflux Web 服务,它可以将上传的多部分文件部分保存到 MongoDB 的 GridFS。 这是正常工作。 今天,有人请求包含添加到 GridFS 的文件的元数据。 不幸的是,我无法让它与我的功能/非注释 Web 服务一起使用。 我将不胜感激任何建议或朝正确方向的推动。 以下是详细信息: 发送到我的端点的请求示例: curl -X "POST" "http://localhost:8080/api/maps" \ -H 'Content-Type: multipart/form-data; charset=utf-8; boundary=__X_BOUNDARY__'"'"'' \ -F "files=@animage.jpg" \ -F "metadata={\"tenantId\":\"598b53702f52f9\",\"projectId\":\"59c0a78d6212dc\"} 这是我当前在没有请求中的元数据的情况下工作的服务,上面: override fun upload(fluxFileParts: Flux<FilePart>): Flux<Map<String, String>> = fluxFileParts .flatMap { filePart -> reactiveGridFsTemplate
  • 如何在离子应用程序中实现Google Drive(how implement google drive in ionic app)
    问题 我需要将我的离子应用程序连接到Google驱动器,显示所有文件,并可能上传,下载,删除,编辑。因此,我尝试使用此https://github.com/Raza-Dar/ionic-google-drive2 错误:无法加载资源:服务器响应状态为404(未找到)https://apis.google.com//scs/apps-static//js/k=oz.gapi.en.RArmLpCIYB0.O /m…1/ed=1/am=QQ/rs=AGLTcCOEiG2RgKkKDvOG7y5PZ-fMFMsJXQ/t=zcms/cb=gapi.loaded_01 未捕获的TypeError:无法调用未定义的方法“ load” 找不到InAppBrowser插件 并且此http://blog.ionic.io/oauth-ionic-ngcordova/1在控制台上没有错误...但是在身份验证后返回主页 而这个http://excellencenodejsblog.com/cordova-ionic-google-oauth-login-for-your-mobile-app/与此相关,我会得到用户的信息,而不是驱动器中的文件 有什么建议吗?请我需要一些工作示例入门代码谢谢 回答1 您需要通过Google本地验证您的cordova应用程序,才能使用这些API。 首先,如果尚未为每个平台
  • 没有线程如何在Javascript中实现承诺(How are Promises implemented in Javascript without threads)
    问题 最近,我一直在AngularJS和JQuery中实现Promises的概念。 我已经在Java代码中看到了Futures的实现,如下面的代码所示,但是这要求在语言/平台中存在线程池的概念。 但是,Javascript中没有这样的线程概念。 那么如何实现Javascript中的Promises? public class Futures1 { private static final ExecutorService pool = Executors .newFixedThreadPool(10); public static void main(String[] args) { Future<String> contentsFuture = null; try { contentsFuture = startDownloading(new URL("http://www.example.com")); } catch (MalformedURLException e) { e.printStackTrace(); } // other computation try { final String contents = contentsFuture.get(); } catch (InterruptedException | ExecutionException e) { e
  • 如何在 iPhone 应用程序中实现 Wikitude API?(How to implement Wikitude API in iPhone Application?)
    问题 我想在我的 iPhone 应用程序中实现 Wikitude API。 但是在我的应用程序中实现这个 API 时,我遇到了一个问题。 我有一个视图控制器,在其中单击一个按钮,我想打开这个 [wikitudeAR start] 就像 [self.view addSubview:[wikitudeAR start]]; 但它不能正常工作。 它没有显示我想在单击按钮时显示的相机视图([wikitudeAR start])。 在您随 wikitude API 提供的示例应用程序中,显示为 [window addSubview:[wikitudeAR start]]; 但我想在我的视图上而不是在主窗口上显示 wikitudeAR 视图(wikitudeAR 相机视图)。 提前致谢。 回答1 嗨,这对我有用,在 verifyDidSucceed 中将控制器添加到窗口: - (void) verificationDidSucceed { //appDel is an AppDelegate shared instance of your application [appDel.window addSubview: [wikitudeAR start]]; } 那么您可以在“启动”控制器后使用显示/隐藏功能来显示控制器。 你可以定义一个IBAction,如果你已经启动了控制器就显示这个; -