正确的服务参考网址是什么?

2023-12-01

我有两个项目,一个是WCF服务,就是在文本框中说出文本/句子。

public class Service1 : IService1
{
    public string RunTts(string text)
    {
        using (SpeechSynthesizer synth = new SpeechSynthesizer())
        {
            // Configure the audio output. 
            synth.SetOutputToDefaultAudioDevice();
            synth.Speak(text);
            return "";
        }
    }
}

然后我在第二个项目中的_Layout.cshtml页面中用ajax调用它,该项目是asp.net mvc。

<script type="text/javascript">
    function ttsFunction() {
        serviceUrl = "Service1.svc/RunTts";

        $.ajax({
            type: "POST",
            url: serviceUrl,
            data: '{"text": "' + $('#speak').val() + '"}',
            contentType: "text/xml; charset=utf-8",
            dataType: "text/xml",
            error: function (xhr,status,error) {
                console.log("Status: " + status); // got "error"
                console.log("Error: " + error);   // got "Not Found"
                console.log("xhr: " + xhr.readyState); // got "4"
            },
            statusCode: {
                404: function() {
                    console.log("page not found"); // got 
                }
            }
        });
    }
</script>

Because I got 404 error, so I think the url is wrong. Please see the structure of files, the web reference is called 'ServiceReference1' I guess. picture


如屏幕截图所示,该服务未托管在您的 Web 应用程序中。您无法直接从客户端访问此类服务(托管在您的 Web 应用程序外部),因为您违反了同源政策限制。它是信任的基本概念之一,网络安全基于此(例如,保护反对者)XSS) - 您无法发送跨域 AJAX 请求。这实质上表明,如果内容来自一个站点(例如https://bank.ny.com) 被授予访问系统资源的权限,那么来自该站点的任何内容都将共享这些权限,而来自另一个站点 (https://nsa.ny.com)必须单独授予权限(一般来说,术语origin使用域名、应用层协议和端口号定义)。

尽管如此,您至少有 4 个解决方案来解决您的问题:

First- 通过中间控制器层与您的服务对话。采用这种方式意味着生成代理类(通过svcutil.exe,您通过使用 Visual Studio 添加服务引用完成的操作)。与该客户的沟通如下:

public class TtsController
{
    public JsonResult RunTts(string text)
    {                        
        using(var client = new ServiceReference1.Service1Client())
        {
            var response = client.RunTts(text);
            return Json(response);
...

JavaScript 端应该使用这样的 URL:var serviceUrl = "/Tts/RunTts"(以及传递到 AJAX 请求的正确 JSON 数据,我将进一步介绍这一点)。

Second- 直接与服务人员交谈。如果您想直接与该服务通信,则必须在 Web 应用程序中托管该服务。应遵循正确的 WCF 配置以支持 RESTful 服务:

<system.serviceModel>
  <behaviors>
    <endpointBehaviors>
      <behavior name="webby">
        <webHttp />
      </behavior>
    </endpointBehaviors>
    <serviceBehaviors>
      <behavior>
        <serviceMetadata httpGetEnabled="true" />
      </behavior>
    </serviceBehaviors>
  </behaviors>
  <services>
    <service name="Namespace.Service1">
      <endpoint address="" 
                behaviorConfiguration="webby"
                binding="webHttpBinding" 
                contract="Namespace.IService1" />
    </service>
  </services>  
</system.serviceModel>

对于 RESTful 端点,您应该使用的绑定是WebHttpBinding以及适当的行为。或者,许多 RESTful 服务都具有免配置体验 -WebServiceHostFactory。您的 .svc 文件应如下所示(MSDN):

<%@ ServiceHost Language="C#" Debug="true" Service="Namespace.Service1"
                CodeBehind="Service1.svc.cs"
                Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>

WebServiceHostFactory创建一个实例WebServiceHost,并且自从WebServiceHost将使用自动配置端点WebHttpBinding以及相关行为,web.config中根本不需要对该端点进行任何配置(当然,如果需要自定义绑定,则必须使用该配置)(MSDN).

然后使用适当的完整 URL 访问服务:http://localhost:[port]/Service1.svc/RunTts或相关的一个:/Service1.svc/RunTts.

由于您使用的是 ASP.NET MVC,根据您的路由定义,请求将分派到某个不存在此类操作的控制器。您必须告诉 MVC 忽略到您的服务的路由:

routes.IgnoreRoute("{resource}.svc/{*pathInfo}");

(顺便说一句:如果您将 .svc 文件放在应用程序中的不同目录下,请分别修改 URL 和路由以忽略。)

您的代码需要一些额外的修复:

  1. 如果要以 JSON 格式发送消息,请指定dataType and contentType参数正确:

    $.ajax({
        url: serviceUrl,
        type: "POST",
        dataType: "json",
        contentType: "application/json; charset=utf-8",
        ...
    
  2. 不要手动构建 JSON 字符串,因为它可能会导致进一步的解析错误 - 使用转换器,例如:

    var data = new Object();
    data.text = $('#speak').val();
    var jsonString = JSON.stringify(data);
    
    $.ajax({
        ...
        data: jsonString,
        ...
    
  3. 为您的服务提供额外的声明性信息:

    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)]        
        string RunTts(string text);
    ...
    
  4. 从项目中删除服务引用。您不需要它,因为这里没有使用中间控制器。

Third - JSONP (look here and here)可用于克服原产地政策限制。但是你不能使用 JSONP 进行 POST,因为它只是不是这样的- 它创建了一个<script>元素来获取数据,这必须通过 GET 请求来完成。 JSONP解决方案不使用XmlHttpRequest对象,因此它不是标准理解方式中的 AJAX 请求,但内容仍然是动态访问的 - 对于最终用户来说没有区别。

$.ajax({
    url: serviceUrl,
    dataType: "jsonp",
    contentType: "application/json; charset=utf-8",
    data: data,
    ...

[OperationContract]         
[WebGet(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate="RunTts?text={text}")]
public string RunTts(string text);

允许跨域请求的 RESTful WCF 配置:

<system.serviceModel>
  <bindings>
    <webHttpBinding>
      <binding name="jsonp" crossDomainScriptAccessEnabled="true" />
    </webHttpBinding>
  </bindings>
  <behaviors>
    <endpointBehaviors>
      <behavior name="webby">
        <webHttp />
      </behavior>
    </endpointBehaviors>
    <serviceBehaviors>
      <behavior>
        <serviceMetadata httpGetEnabled="true" />
      </behavior>
    </serviceBehaviors>
  </behaviors>
  <services>
    <service name="Namespace.Service1">
      <endpoint address="" 
                behaviorConfiguration="webby"
                binding="webHttpBinding" 
                bindingConfiguration="jsonp"
                contract="Namespace.IService1" />
    </service>
  </services>
</system.serviceModel>

Fourth - CORS。在现代浏览器中实现选择带填充的 JSON。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

正确的服务参考网址是什么? 的相关文章

随机推荐

  • 如何消除应用栏上的弹跳效果?

    应用栏过去在滑动时会出现问题 它滚动得不顺畅 请参考这些 http stackoverflow com questions 30923889 flinging with recyclerview appbarlayout https git
  • 查询在函数内部不起作用

    嗯 我在 SMF 的自定义脚本中有这个函数 query SELECT id member real name id group FROM smf members WHERE id group gt 0 AND id group 9 AND
  • 如何垂直居中 Bootstrap 轮播标题?

    我有一个引导轮播 我正在尝试为轮播创建一个标题 该标题始终垂直居中并稍微向左定位 我有用于水平定位的CSS 但是当我尝试垂直定位时 标题不会保持原样 如何保持 carousel caption 始终垂直居中并稍微偏左 HTML div cl
  • 可选关键字参数的命名元组和默认值

    我正在尝试将一个较长的空心 数据 类转换为命名元组 我的班级目前如下所示 class Node object def init self val left None right None self val val self left lef
  • ASP MVC4 中的模型传递背后发生了什么

    现在正在学习 ASP MVC 这只是我学习 MVC 的第三周 我对建模传递做了一些测试 基本上控制器只是获取模型 然后传递到视图而不执行任何操作 但似乎代码失败了 下面是我创建的 ViewModel using System using S
  • 如何在iPhone App中显示Facebook粉丝墙?

    我想如下图所示显示 Facebook 粉丝墙 您能让我知道如何做到吗 Thanks 您可以从以下位置拉取墙源列表https graph facebook com cocacola statuses access token 可以使用 gra
  • 我可以使用“pip”而不是“easy_install”来解决“python setup.py install”依赖关系吗?

    python setup py install将自动安装列出的软件包requires using easy install 我该如何使用它pip反而 是的你可以 您可以从网络或计算机上的 tarball 或文件夹安装软件包 例如 从网络上的
  • Typescript 联合类型在 Swift 中的等价物是什么?

    我想在 Swift 上创建类似的东西 用于 Alamofire json 解析 interface Question value string data string interface Advice type string data va
  • 将数据 URI 写入 Firefox 扩展中的文件

    我正在开发一个 Firefox 插件 我需要将一堆数据 URI 图像保存到磁盘 我该如何解决这个问题 我浏览过MDN 上的文件 I O 片段 但这些片段对我没有多大帮助 有异步和同步方法 我想使用异步方法 但如何使用异步方法编写二进制文件
  • 使用按钮api动态更改jquery Datatables导出excel的文件名

    来自 API myTable DataTable buttons buttons text Alert action function e dt node config config title dynamic title 这正在更改标题
  • 具有数据依赖性的 for 循环的向量化

    我有一个基于 BiCCG 共轭梯度 的矩阵求解器的实现 它也考虑了周期性 碰巧的是 实现是计算密集型的 并且由于依赖性问题 循环没有自动矢量化 我探索了一下 似乎红黑高斯赛德尔算法比普通版本 也有类似的依赖性问题 更有效地可并行化 是否可以
  • 使用shinyBS包中的bsModal和plotly R的plotly_click在弹出窗口中生成新图

    这是我使用的基本闪亮应用程序的代码plotly click事件可选择显示另一个情节 我希望该侧箱图在模式弹出窗口中呈现 而不是在页面内的侧面呈现 library shiny library plotly df1 lt data frame
  • 以编程方式更新嵌入的 Excel 文件

    我正在尝试以编程方式修改 Word 文档中嵌入的 Excel 表格 为此 我修改了 docx 文件和嵌入的 Excel 文件 主要文件的重要部分如下
  • 按元值对 wp_query 进行排序

    我有一个自定义帖子类型 即作品集 我需要能够按元值 即作者姓名 对其进行排序 我已经尝试了几个示例 但没有任何效果 任何帮助将不胜感激 My Code args array post type gt portfolio meta key g
  • 将匿名函数定义为 m 文件函数 4 个输出中的 2 个

    我有一个带有 4 个输出的 m 文件函数 我想定义一个具有相同输入的匿名函数 但只产生四个输出中的两个 这可能吗 AFAIK 您不能仅使用内联匿名函数来执行此操作 因为 Matlab 语法不提供在单个表达式中捕获函数的多个输出并对其进行索引
  • 加载项如何检测解决方案何时加载?

    我的加载项如何检测解决方案何时加载 我知道 DTE 模型中的某个地方一定有一些事件 但我找不到它 我的加载项在 Visual Studio 加载时加载 但这取决于打开的解决方案 在 MS 失去对 COM 的病态关注之前 我不想将其设为解决方
  • MS Entity Framework 如何从概念模型映射到 CLR 类型?

    给定一个 代码生成策略 设置为 无 的实体数据模型 EDMX EF 如何确定将概念模型映射到哪些 CLR 类型 我想我在某处读到它只是探测与概念模型匹配的类型的程序集 但这是参考 EF 的 CTP 版本 现在还是这样吗 我可以以某种方式控制
  • 如何使用STL获取系统的小数分隔符?

    要生成具有正确数字分隔符 或 的 csv 文件 因为我希望它们与计算机上安装的 Excel 版本兼容 所以我需要从 C 程序获取小数分隔符 我的机器有法语版本的 Windows Excel 因此小数点分隔符是 int main std co
  • ElseIf 与 Else If

    多年来我一直在使用Else If在 VBScript 中编码 If a b Then Else If a c Then End If 这似乎按要求工作 我还在网上看到很多网站使用Else If 除了 MSDN 使用ElseIf 之间有区别吗
  • 正确的服务参考网址是什么?

    我有两个项目 一个是WCF服务 就是在文本框中说出文本 句子 public class Service1 IService1 public string RunTts string text using SpeechSynthesizer