使用 Windows 身份验证的 WCF jsonP - 可能吗?

2023-12-26

我正在托管一个输出 jsonp 的 wcf 服务。来自 IIS(打开 Windows 身份验证)的响应是

经过身份验证的服务不支持跨域 javascript 回调。

有办法解决这个问题吗?我必须打开 Windows 身份验证,但也想使用 wcf 来服务器我的 jsonp

我的网络配置如下

<system.serviceModel>
  <behaviors>
    <endpointBehaviors>
      <behavior name="webHttpBehavior">
        <webHttp />
      </behavior>
    </endpointBehaviors>
  </behaviors>
  <bindings>
    <webHttpBinding>
      <binding name="webHttpBindingWithJsonP" crossDomainScriptAccessEnabled="true" >
        <security mode="TransportCredentialOnly">
          <transport clientCredentialType="Ntlm"/>
        </security>
      </binding>
    </webHttpBinding>
  </bindings>
  <services>
    <service name="ServiceSite.CustomersService">
      <endpoint address="" binding="webHttpBinding"
                bindingConfiguration="webHttpBindingWithJsonP" contract="ServiceSite.CustomersService"
                behaviorConfiguration="webHttpBehavior"/>
    </service>
  </services>
</system.serviceModel>

我明白了,有点晚了,但由于没有发布答案,我遇到了类似的问题:

我能够使用从跨域客户端访问的经过 Windows 验证的 WCF 服务(托管在 IIs 7.5 中)的唯一方法是让客户端通过代理进行调用。有一个额外的跃点返回代理,但现在我不再依赖 JSONP。该服务设置有两个端点:soap 和 json - 我将整个 serviceModel 放在底部以供参考。

因此,客户端应用程序(都是 .NET Web 应用程序)可以:

A) 将 $.ajax POST 发送到页面方法(或 [HttpPost] MVC 控制器方法),该方法调用 WCF 作为肥皂 Web 引用:

function EmployeeSearch() {
    var searchname = $("#userSearchText").val();
    if (searchname.length > 0) {
        var d = { name: searchname, pageSize: _pageSize, page: _currentPage };
        var jsonData = JSON.stringify(d);
        if (json.length > 0) {
            $.ajax({
                type: "POST",
                url: "Home/EmployeeSearch",
                data: jsonData,
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: employeeSearchSuccess,
                error: onError
            });
        }
    }
}

以及控制器方法(或页面方法):

    [HttpPost]
    public ActionResult EmployeeSearch(string name, int pageSize, int page)
    {
        var client = new EmployeeServiceClient();
        var searchResult = client.EmployeeSearch(name);
        var count = searchResult.Count();
        var employees = searchResult.Skip((page - 1) * pageSize).Take(pageSize).ToList();

        var viewModel = new EmployeeSearchViewModel
                            {
                                Employees = employees,
                                Size = count
                            };

        return Json(viewModel);
    }

OR

B) 为 HttpHandler 创建 $.getJSON,如 Dave Wards 中所述http://encosia.com/use-asp-nets-httphandler-to-bridge-the-cross-domain-gap/ http://encosia.com/use-asp-nets-httphandler-to-bridge-the-cross-domain-gap/

在上面的示例中,处理程序的 ProcessRequest 方法中的 WebClient.DownoadString() 将采用以下 url 字符串:

http://server/EmployeeService/EmployeeService.svc/Json/EmployeeSearch/searchstring http://server/EmployeeService/EmployeeService.svc/Json/EmployeeSearch/searchstring

这两种方法都允许我的服务保留在 Windows 身份验证下,并且客户端有多种访问该服务的方法。额外的跳跃很烦人,但我尽量不去想它。

这是整个WCF服务模型供参考:

<behaviors>
    <serviceBehaviors>
        <behavior name="EmployeeServiceBehavior">
            <serviceTimeouts transactionTimeout="01:00:00"/>
            <serviceMetadata httpGetEnabled="true"/>
            <serviceDebug includeExceptionDetailInFaults="true"/>
            <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
        </behavior>
    </serviceBehaviors>

    <!-- we'd use this one if we wanted to ignore the 'd' wrapper around the json result ... we don't -->
    <endpointBehaviors>
        <!-- plain old XML -->
        <behavior name="poxBehavior">
            <webHttp helpEnabled="true" />
        </behavior>
        <!-- JSON -->
        <behavior name="jsonBehavior">
            <enableWebScript />
        </behavior>
    </endpointBehaviors>

</behaviors>

<bindings>
    <basicHttpBinding>
        <binding name="basicBinding"
                hostNameComparisonMode="StrongWildcard"
                receiveTimeout="00:10:00"
                sendTimeout="00:10:00"
                openTimeout="00:10:00"
                closeTimeout="00:10:00"
                maxReceivedMessageSize="2147483647"
                maxBufferSize="2147483647"
                maxBufferPoolSize="524288"
                transferMode="Buffered"
                messageEncoding="Text"
                textEncoding="utf-8"
                bypassProxyOnLocal="false"
                useDefaultWebProxy="true" >
            <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
            <!-- use the following for windows authentication -->
            <security mode="TransportCredentialOnly">
                <transport clientCredentialType="Windows" />
            </security>
        </binding>
    </basicHttpBinding>

    <webHttpBinding>
        <binding name="webBinding"
                receiveTimeout="00:10:00"
                sendTimeout="00:10:00"
                openTimeout="00:10:00"
                closeTimeout="00:10:00"
                maxReceivedMessageSize="2147483647"
                maxBufferSize="2147483647"
                maxBufferPoolSize="524288"
                bypassProxyOnLocal="false"
                useDefaultWebProxy="true"
                >
            <!--crossDomainScriptAccessEnabled="true"-->
            <!-- use the following for windows authentication -->
            <security mode="TransportCredentialOnly">
                <transport clientCredentialType="Windows" />
            </security>
        </binding>
    </webHttpBinding>

</bindings>

<services>
    <service name="EmployeeService.Wcf.EmployeeService" behaviorConfiguration="EmployeeServiceBehavior">
        <endpoint address="Soap" binding="basicHttpBinding" bindingConfiguration="basicBinding" contract="EmployeeService.Wcf.IEmployeeService"/>
        <endpoint address="Json" binding="webHttpBinding" bindingConfiguration="webBinding" behaviorConfiguration="poxBehavior" contract="EmployeeService.Wcf.IEmployeeService" />
    </service>
</services>

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

一项补充 - 上述示例方法的 OperationContract 在 ServiceContract 中设置如下:

    [OperationContract]
    [WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "EmployeeSearch/{name}")]
    List<Employee> EmployeeSearch(string name);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Windows 身份验证的 WCF jsonP - 可能吗? 的相关文章

  • 从 WCF REST 获取错误详细信息

    我有一个由 Net WCF 客户端使用的 REST 服务 遇到错误时 REST 服务会返回 HTTP 400 错误请求 响应正文包含 JSON 序列化详细信息 如果我使用 Fiddler Javascript 或直接从 C 执行请求 我可以
  • 如何为WCF服务创建重定向?

    我的网站 A 上托管了一个 WCF 服务 我还有另一个网站 B 它使用 IIS URL 重写将所有请求重定向到我的网站 A 但是 站点 B 不处理任何对 svc 文件的请求 返回 404 not find 知道如何让它发挥作用吗 UPD重定
  • IIS Express 安装目录在哪里?

    我最近开始了一个 ASP NET 教程 我想测试我用 WebMatrix 制作的页面 然而 有一个错误 Web 服务器配置为不列出该目录的内容 因此 它建议启用目录浏览并转到 IIS Express 安装目录并运行命令 那么它到底位于哪里呢
  • SQL Server 登录错误:用户“NT AUTHORITY\SYSTEM”登录失败

    我创建了一个名为 schoolPool 的应用程序池并将其分配给我的 Web 应用程序 该池的标识已设置为 LocalSystem 当我尝试从应用程序内访问数据库 即打开 SQL 连接 时 我总是收到以下错误 Login failed fo
  • WCF 缓存解决方案 - 需要建议

    我工作的公司正在寻求实施缓存解决方案 我们托管了多个 WCF Web 服务 并且需要缓存某些可以持久保存和获取的值 无论客户端与服务的会话如何 我正在研究以下技术 缓存应用程序块 4 1 使用 HttpRuntime 缓存的 WCF TCP
  • 堆内存问题

    有一个 WCF 自托管服务必须在 99 的时间内正常工作 有时我们会遇到这样的记忆问题 但问题发生后 服务一切正常 我们该如何处理这个问题 任何关于提供能够在不同情况下生存的强大服务的提示和要点都非常受欢迎 我不太确定问题出在哪里 但内存泄
  • 为什么 IIS 不执行我的网站根目录 index.php 文件的 PHP 代码?

    IIS实际上是在发送将代码发送到浏览器而不是执行它 但是 仅针对根http domain com index php file 该文件夹中的所有其他 php 文件和子文件夹中的 index php 文件均按预期执行 我怎样才能执行我的根in
  • “服务 X 的应用程序端点为零”,除非我在代码中添加端点 - 为什么?

    我跟着这篇 MSDN 文章 http msdn microsoft com en us library ms733069 aspx完全创建托管在托管 NT 服务中的 WCF 服务 当我在服务控制台中单击 开始 时 我会在事件查看器中看到以下
  • 使用 CustomBinding 的 WCF 服务配置 HTTPS

    我需要 WCF 服务上的自定义绑定 以允许我将原始内容传递到 WCFRest 服务 效果很好 但我无法让它接受传输级安全性 我想要 https 和 basicauthentication 就像我在其他地方使用的那样 端点看起来像这样
  • appsettings.json 是否受 IIS 保护?

    在旧版 ASP NET 应用程序中 config files cannot通过导航到 URL 即可下载 但新的约定是使用appsettings json 现在 如果我有一个名为的 ASP NET Core 网站contoso com它由 I
  • 反序列化 HTTP POST 参数

    我正在尝试找到一种更原生或更优雅的解决方案 用于将 HTTP POST 参数反序列化为相应的对象 目前 我将字符串转换为字典 然后将其序列化为 JSON 然后将其反序列化为我的最终对象 参数字符串示例 TotalCost 0 01200 D
  • 在 WCF 中通过 net.pipe 运行多个服务

    我正在构建一个分布式应用程序 需要 6 种不同的服务 我必须使用 Visual Studio 2008 在我的 XP 笔记本电脑上演示该应用程序 是否可以同时在 localhost 上运行多个服务 所有服务都使用 net pipe 例如 n
  • WCF - 将空元素转换为可为空的本机类型

    将 SOAP 字段元素留空会导致本机类型出现强制转换错误 遗憾的是 由于客户端限制 无法使用 xsi nil true 将 WCF 协定本机类型标记为 nullable 似乎不足以阻止将以下错误返回给客户端 字符串 不是有效的布尔值 在 S
  • 从 WCF 服务返回接口

    我有一些 NET 远程处理代码 其中在某些服务器端类中实现的工厂方法返回具体对象的接口 也在同一台服务器上执行 NET 远程处理会自动创建代理 并允许我将接口传递给客户端 然后客户端可以直接调用它们 接口示例 public interfac
  • WCF、REST、SSL、客户端、自定义证书验证

    我有一个无法解决的具体问题 让我详细解释一下 我是这项技术的新手 所以我可能使用了一些错误的术语 如有不明白之处 请指正并解释或要求解释 我正在创建一个自托管的 WCF REST 服务器 托管在 WPF 应用程序中 它使用 https SL
  • 如何使用PowerShell脚本远程启动/停止IIS 6.0/7.0?

    我有两台服务器服务器 A 和服务器 B 我想使用 Powershell 脚本从服务器 B 远程停止服务器 A 最简单的方法之一就是使用命令行执行PsExec http www microsoft com technet sysinterna
  • “固定请求数”后应用程序池回收

    IIS的应用程序池设置为 固定请求数 后回收有什么影响 假设这个数字是100 第99个人连接到我的网站 那么第100个人来了 就会触发应用程序池回收 这是否意味着会话 1 99 的所有会话信息都将丢失 进程内会话将在应用程序池工作进程重新启
  • 如何生成wcf服务库项目的wsdl文件?

    我的解决方案中有一些 Wcf 服务库项目 不是 Wcf 服务应用程序 我必须将项目的 wsdl 文件提供给将使用这些服务的同事 我怎样才能做到这一点 提前致谢 您可以使用WCF服务主机 http msdn microsoft com en
  • 如何让 shell_exec 在 IIS 6.0 上运行

    问题 我有一个 PHP 脚本 它使用shell exec运行 pdf 到文本转换器 为了简化问题 我创建了一个简短的脚本 使用shell exec只是回显的输出dir命令 当我在 Apache 服务器上运行它时 一切都按预期运行 当我切换到
  • 发布到IIS,设置环境变量

    阅读这两个问题 答案 我能够在 IIS 8 5 服务器上运行 Asp net 5 应用程序 Asp net vNext 早期测试版发布到 Windows 服务器中的 IIS https stackoverflow com questions

随机推荐

  • 无法读取未定义的属性“NullLogger”(角度/cli 1.4.7)

    今天 突然我开始收到此错误 无法读取未定义的属性 NullLogger 在尝试在我的 Angular 4 应用程序中添加组件 ng g c abc 时 当我在谷歌上搜索时 人们建议我们需要将 cli 版本更新到 1 4 10 但问题是为什么
  • Android MapView - 设置自动缩放,直到所有 ItemizedOverlay 都可见

    在 onCreate 中硬编码 setZoom 感觉非常过时 我想通过最初让 MapView 设置缩放直到所有 GeoPoints OverlayItems 在地图上可见来增强用户体验 这怎么能自动神奇地完成呢 有点像这样 int minL
  • 是否可以从数据帧转换为矩阵?

    我是Python新手 我有一个巨大的dataframe Person OD A BS1 A BS2 B BS4 B BS8 C BS5 C BS1 D BS9 D BS7 E BS2 E BS7 F BS2 F BS1 G BS1 G BS
  • 如何大声朗读Python列表推导式?

    我的问题是关于Python的列表理解可读性 当我遇到具有复杂 嵌套列表理解的代码时 我发现我必须重新阅读它们几次才能理解其意图 有没有一种直观的方法来朗读列表推导式 看来我应该从中间开始 读 然后读if条件 如果有 并阅读表达 last 以
  • 以 bed 格式从 R 导出文件

    我有一个像这样的数据框 tab gt elements scaffold start end Lengths 1 Dong 1 NVe R4 Nematostella12 1 KQ415659 1 14193 14540 347 2 OK
  • 什么是位置提供商“被动”?在搭载 Android 2.2 的 HTC Desire 上看到

    在进入基于位置的模式之前 我通过调用检查是否存在任何位置提供商 List
  • 如何设置JVM的PATH环境变量

    我正在尝试运行使用 Java 7 ProcessBuilder 安装在我的系统上的可执行文件 我注意到环境变量 PATH 可以通过 System getenv PATH 不包括我自己的自定义设置路径 它返回这个 usr bin bin us
  • Excel表格行列查找

    我在使用某些 Excel 函数时遇到了困难 我有一个带有行标题和列标题以及数据的表 例如 如果我有一种披萨 与其尺寸交叉 数据就是价格 S M L XL Cheese 6 6 5 8 10 Pepperoni 6 5 7 5 10 12 S
  • 使用 argparse 输出来调用函数

    目前我的代码如下所示 它允许我解析我的程序脚本获取的多个参数 有没有更接近 最佳实践 的不同方法 我还没有看到实际使用输出的代码argparse 仅介绍如何设置 def useArguments x 0 while x lt 5 if x
  • Angular 6 - 如何在组件级别应用外部 CSS 样式表(传单)?

    尝试在 Angular 6 组件中使用 Leaflet 根据 css 文件的链接方式 地图显示正常或混乱 缺少的图块顺序不正确 这意味着未考虑 css 我设法让它与 2 个解决方案一起使用 将 css 链接到应用程序级别 全局 但不仅仅链接
  • 您可以在动态计时器上触发 AWS Lambda 吗?

    有没有办法在动态计时器上触发 AWS Lambda 目前 我正在利用预定事件来触发 lambda 但这是一个设定的计时器 有没有办法动态设置从 Lambda 内部触发 Lambda 的时间 这里的想法是 这个 Lambda 执行特定的检查并
  • Rails、yml 和多行

    我一生都无法从我的语言环境文件中获取多行 yaml 来工作 我尝试了多种解决方案的每种组合 但没有成功 我努力了key key gt 双引号 单引号 n 下一行的值 缩进 可能还有其他一些 在我看来我只是使用t key 我在这里撕扯我的头发
  • 将分面 ggplots (facet_wrap) 与 R 中的owplot 对齐

    我正在尝试对齐两个面板图 它们是用facet wrap in ggplot按照以下方式 注意 面板 A 需要保持为空 然而 我注意到面板 B 的 y 轴与面板 C 的最后一个图的 y 轴并不完全对齐 尽管选项axis lb 在两个方面 Co
  • 按日期对 HashMap 进行排序

    在 Java 类中 我有一个按日期重新排序现有 HashMap 的方法 HashMap 是一种类型
  • 在 CodeIgniter 上集成 Bootstrap

    我正在尝试在 codeigniter 网站上使用 bootstrap 但似乎找不到 bootstrap 文件
  • 带参数的路由不起作用

    我正在关注tutorial https openui5 hana ondemand com docs guide 2366345a94f64ec1a80f9d9ce50a59ef html在这里 我陷入了带参数的路由 该示例应用程序未在我的
  • C++ 元函数来确定类型是否可调用

    是否可以编写一个 C 0x 元函数来确定类型是否可调用 我所说的可调用类型是指函数类型 函数指针类型 函数引用类型 这些由boost function types is callable builtin lambda 类型以及任何具有重载的
  • 为什么 Rubocop 不允许 html_safe 或 raw() Rails

    这是我没有通过 Rubocop 的代码 因为 Rails OutputSafety 将字符串标记为 html 安全可能存在安全风险 def number with html delimiter num number with delimit
  • 运行“yarn run”时将参数传递给“node”可执行文件

    节点可以使用各种选项启动 特别有趣的是 inspect flag node inspect node modules bin jest some spec js 是否可以通过 inspect以某种方式标记yarn run 例如 yarn r
  • 使用 Windows 身份验证的 WCF jsonP - 可能吗?

    我正在托管一个输出 jsonp 的 wcf 服务 来自 IIS 打开 Windows 身份验证 的响应是 经过身份验证的服务不支持跨域 javascript 回调 有办法解决这个问题吗 我必须打开 Windows 身份验证 但也想使用 wc